Search code examples
androidkotlinnavigation-drawerandroid-appbarlayout

Action Bar Drawer Toggle displayed on AppBar but not working?


I created a class called BaseActivity that all of the activities inherit from so that I can add the drawer layout in all of my activities.

The Drawer Toggle button is shown in the AppBar, but when I click on it nothing happens!

Here is the code for the BaseActivity.kt:

open class BaseActivity : AppCompatActivity() {

private var dl: DrawerLayout? = null
private var t: ActionBarDrawerToggle? = null
private var nv: NavigationView? = null

  override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
     setContentView(R.layout.base_activity)
     dl = findViewById(R.id.drawer_layout)
     t = ActionBarDrawerToggle(this, dl,  R.string.drawer_open, R.string.drawer_close)
      supportActionBar?.setDisplayShowTitleEnabled(true);
      supportActionBar?.setHomeButtonEnabled(true);
      supportActionBar?.setDisplayHomeAsUpEnabled(true);
     dl?.addDrawerListener(t!!)
     t?.syncState()

     nv = findViewById(R.id.navigation_view)
    nv?.setNavigationItemSelectedListener(NavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.nav_note -> Toast.makeText(this@BaseActivity, "My Account", Toast.LENGTH_SHORT).show()
            R.id.nav_calendar -> Toast.makeText(this@BaseActivity, "Settings", Toast.LENGTH_SHORT).show()
            R.id.nav_trash -> Toast.makeText(this@BaseActivity, "Trash", Toast.LENGTH_SHORT).show()
            else -> return@OnNavigationItemSelectedListener true
        }
        true
    })
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return if (t?.onOptionsItemSelected(item) == true) {
        true
    } else super.onOptionsItemSelected(item!!)
}

}

and here the base_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BaseActivity">
<!--include layout="@layout/toolbar"/-->

<com.google.android.material.navigation.NavigationView
    android:id="@+id/navigation_view"
    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/nav_header"/>

</androidx.drawerlayout.widget.DrawerLayout>

For the style I left it at DarkActionBar. Here is how it looks like Don't mind what's written there

I still cannot figure out what's wrong and why it doesn't work. I appreciate any suggestions from the community. Thank you.


Solution

  • So I kind of changed my code to this and it is working Here is the new code for BaseActivty class

    open class BaseActivity : AppCompatActivity() {
        //var toolbar: Toolbar? = null
        var drawerLayout: DrawerLayout? = null
        var drawerToggle: ActionBarDrawerToggle? = null
        var navigationView: NavigationView? = null
        var mContext: Context? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mContext = this@BaseActivity
            setContentView(R.layout.base_activity)
        }
    
        override fun setContentView(layoutResID: Int) {
            val fullView = layoutInflater.inflate(R.layout.base_activity, null) as DrawerLayout
            val activityContainer = fullView.findViewById<View>(R.id.activity_content) as FrameLayout
            layoutInflater.inflate(layoutResID, activityContainer, true)
            super.setContentView(fullView)
        }
    
    
    
        private fun setUpNav() {
            drawerLayout = findViewById<View>(R.id.drawer_layout) as DrawerLayout
            drawerToggle = ActionBarDrawerToggle(
                this@BaseActivity,
                drawerLayout,
                R.string.app_name,
                R.string.app_name
            )
            drawerLayout!!.setDrawerListener(drawerToggle)
            supportActionBar!!.setHomeButtonEnabled(true)
            supportActionBar!!.setDisplayHomeAsUpEnabled(true)
            navigationView = findViewById<View>(R.id.navigation_view) as NavigationView
    
    
            // Setting Navigation View Item Selected Listener to handle the item
            // click of the navigation menu
            navigationView!!.setNavigationItemSelectedListener(NavigationView.OnNavigationItemSelectedListener { menuItem -> // Checking if the item is in checked state or not, if not make
                // it in checked state
                if (menuItem.isChecked) menuItem.isChecked = false else menuItem.isChecked = true
    
                // Closing drawer on item click
                drawerLayout!!.closeDrawers()
    
                // Check to see which item was being clicked and perform
                // appropriate action
                val intent_calendar = Intent(this, CalendarActivity::class.java)
                val intent_add_note = Intent(this, AddActivity::class.java)
                val intent_note = Intent(this, MainActivity::class.java)
                when (menuItem.itemId) {
                    R.id.nav_note -> this.startActivity(intent_note)
                    R.id.nav_calendar -> this.startActivity(intent_calendar)
                    R.id.nav_trash -> Toast.makeText(this, "Trash", Toast.LENGTH_SHORT).show()
                    R.id.nav_add_note -> this.startActivity(intent_add_note)
                    else -> return@OnNavigationItemSelectedListener true
                }
                false
            })
    
            // calling sync state is necessay or else your hamburger icon wont show
            // up
            drawerToggle!!.syncState()
        }
    
        public override fun onPostCreate(savedInstanceState: Bundle?) {
            super.onPostCreate(savedInstanceState)
            setUpNav()
            drawerToggle!!.syncState()
        }
    
        override fun onConfigurationChanged(newConfig: Configuration) {
            if (newConfig != null) {
                super.onConfigurationChanged(newConfig)
            }
            drawerToggle!!.onConfigurationChanged(newConfig)
        }
    
    
        override fun onOptionsItemSelected(item: MenuItem): Boolean {
            return if (drawerToggle?.onOptionsItemSelected(item) == true) {
                true
            } else super.onOptionsItemSelected(item!!)
        }
    }
    

    and here is the code for its xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".BaseActivity"
        >
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <FrameLayout
                android:id="@+id/activity_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/drawer_menu"
            app:headerLayout="@layout/nav_header"/>
    
    </androidx.drawerlayout.widget.DrawerLayout>
    

    Here is the answer that helped me, (I didn't use a toolbar and i left the style to "Theme.AppCompat.Light.DarkActionBar") https://stackoverflow.com/a/42533759/15018682