Search code examples
androidnavigationfragmentandroid-appbarlayout

How to make RTL appBarConfiguration androidx.navigation?


I want make RTL appBarConfiguration. and this is my code for MainActivity. is there any way that help me to do this without use custom toolbar or make some custom things? I search and found this is android document : [navigation-ui][1] but I look for something simple like layout direction if something like this is it available

MainActivity class:


    private lateinit var drawerLayout: DrawerLayout
    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding =
            DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout

        val navController = this.findNavController(R.id.navHostFragment)
        appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

        navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, _: Bundle? ->
            if (nd.id == nc.graph.startDestination) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
            } else {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            }
        }

        NavigationUI.setupWithNavController(binding.navView, navController)
    }



    override fun onSupportNavigateUp(): Boolean {
        val navigationController = findNavController(R.id.navHostFragment)
        return navigationController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }


    override fun onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
            drawerLayout.closeDrawer(GravityCompat.START)
        } else {
            return super.onBackPressed()
        }
    }
}

and here activity_main.xml:

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layoutDirection="rtl"
    tools:openDrawer="start"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/navHostFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation"/>


    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/drawer_menu"
        app:headerLayout="@layout/fragment_cart"
        />



</androidx.drawerlayout.widget.DrawerLayout>
</layout>```

[![now it's look like this:][2]][2]

I wanna hamberger menu place in right and that three icon place in left


  [1]: https://developer.android.com/guide/navigation/navigation-ui#kotlin
  [2]: https://i.sstatic.net/eOur8.png

Solution

  • I can fix it by adding this section in activity_main.xml and MainActivity.kt

    activity_main.xml

    <layout xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
    
        </data>
    
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutDirection="rtl"
        tools:openDrawer="start"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark" />
    
        <fragment
            android:id="@+id/navHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/navigation"/>
        </LinearLayout>
    
        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:menu="@menu/drawer_menu"
            app:headerLayout="@layout/fragment_cart"
            />
    
    
    
    </androidx.drawerlayout.widget.DrawerLayout>
    </layout> ```
    
    MainActivity.kt:
    
    ``` class MainActivity : AppCompatActivity() {
    
        private lateinit var drawerLayout: DrawerLayout
        private lateinit var appBarConfiguration: AppBarConfiguration
        private lateinit var toolbar: androidx.appcompat.widget.Toolbar
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding =
                DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
            drawerLayout = binding.drawerLayout
            toolbar = binding.toolbar
    
    
            setSupportActionBar(toolbar)
            //supportActionBar?.setDisplayHomeAsUpEnabled(true)
            //supportActionBar?.setDisplayShowHomeEnabled(true)
    
            val navController = this.findNavController(R.id.navHostFragment)
            appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
            NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
    
            navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, _: Bundle? ->
                if (nd.id == nc.graph.startDestination) {
                    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
                } else {
                    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
                }
            }
    
            NavigationUI.setupWithNavController(binding.navView, navController)
        }
    
    
    
        override fun onSupportNavigateUp(): Boolean {
            val navigationController = findNavController(R.id.navHostFragment)
            return navigationController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
        }
    
    
        override fun onBackPressed() {
            if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
                drawerLayout.closeDrawer(GravityCompat.START)
            } else {
                return super.onBackPressed()
            }
        }
    } ```
    
    I hope this help someone.