抽象导航抽屉 Android
Abstract Nav Drawer Android
我正在尝试抽象我的导航抽屉以简化我的 Android 应用程序,但我 运行 遇到了一些问题。导航抽屉根本不响应触摸,我不明白为什么。
MainActivity.kt
class MainActivity : NavActivity() {
/** ON CREATE **/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_seekbar_price!!.setOnSeekBarChangeListener(this)
mDrawerLayout = findViewById(R.id.drawer_layout) // Variable in superclass
...
NavDrawer.kt
abstract class NavActivity : BaseActivity() {
/** Variables **/
lateinit var mDrawerLayout: DrawerLayout
/** ON CREATE **/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nav)
// Set Nav Drawer listener
nav_view.setNavigationItemSelectedListener { menuItem ->
Log.d("NAV", "nav selected listener header")
menuItem.isChecked = true
mDrawerLayout.closeDrawers()
navMenuSwitch(menuItem)
true
}
// Set Nav Footer listener
nav_footer.setNavigationItemSelectedListener { menuItem ->
Log.d("NAV", "nav selected listener footer")
menuItem.isChecked = false
mDrawerLayout.closeDrawers()
navMenuSwitch(menuItem)
true
}
}
...
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.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"
android:background="@color/colorBackground"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
...
</FrameLayout>
<include layout="@layout/activity_nav" />
</android.support.v4.widget.DrawerLayout>
activity_nav.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/drawer_header"
app:headerLayout="@layout/nav_header">
<android.support.design.widget.NavigationView
android:id="@+id/nav_footer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:menu="@menu/drawer_footer">
</android.support.design.widget.NavigationView>
</android.support.design.widget.NavigationView>
我认为这与在子 class 中分配 mDrawerLayout 有关,但这并没有解决任何问题。但它从不调用监听器,无论您点击多少次,它甚至都不会在该监听器中打印日志。
欢迎任何帮助,因为我一辈子都弄不明白,提前谢谢你!
当您的 MainActivity
的 onCreate()
被调用时,会按此顺序发生四件事:
MainActivity
的内容视图是通过膨胀activity_nav.xml
设置的。
nav_view
和 nav_footer
Kotlin 变量是通过在内容视图中搜索它们来分配的。 (Kotlin does this for you,所以很容易忘记它正在发生。)
- 听众已附加到
nav_view
和 nav_footer
视图。
MainActivity
的内容视图再次设置,这次是通过膨胀 activity_main.xml
。 (activity_main.xml
内的 include
标签告诉框架它应该在这个过程中扩充 activity_nav.xml
的另一个副本。)旧的内容视图被覆盖。
所以当 MainActivity.onCreate()
完成时,附加了侦听器的视图已经消失了。解决此问题的一种方法是从 NavActivity.onCreate()
中删除行 setContentView(R.layout.activity_nav)
并将其余行移至从 MainActivity.onCreate()
.
调用的 initNavDrawerListeners()
方法中
我正在尝试抽象我的导航抽屉以简化我的 Android 应用程序,但我 运行 遇到了一些问题。导航抽屉根本不响应触摸,我不明白为什么。
MainActivity.kt
class MainActivity : NavActivity() {
/** ON CREATE **/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
main_seekbar_price!!.setOnSeekBarChangeListener(this)
mDrawerLayout = findViewById(R.id.drawer_layout) // Variable in superclass
...
NavDrawer.kt
abstract class NavActivity : BaseActivity() {
/** Variables **/
lateinit var mDrawerLayout: DrawerLayout
/** ON CREATE **/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nav)
// Set Nav Drawer listener
nav_view.setNavigationItemSelectedListener { menuItem ->
Log.d("NAV", "nav selected listener header")
menuItem.isChecked = true
mDrawerLayout.closeDrawers()
navMenuSwitch(menuItem)
true
}
// Set Nav Footer listener
nav_footer.setNavigationItemSelectedListener { menuItem ->
Log.d("NAV", "nav selected listener footer")
menuItem.isChecked = false
mDrawerLayout.closeDrawers()
navMenuSwitch(menuItem)
true
}
}
...
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.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"
android:background="@color/colorBackground"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
...
</FrameLayout>
<include layout="@layout/activity_nav" />
</android.support.v4.widget.DrawerLayout>
activity_nav.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/drawer_header"
app:headerLayout="@layout/nav_header">
<android.support.design.widget.NavigationView
android:id="@+id/nav_footer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:menu="@menu/drawer_footer">
</android.support.design.widget.NavigationView>
</android.support.design.widget.NavigationView>
我认为这与在子 class 中分配 mDrawerLayout 有关,但这并没有解决任何问题。但它从不调用监听器,无论您点击多少次,它甚至都不会在该监听器中打印日志。
欢迎任何帮助,因为我一辈子都弄不明白,提前谢谢你!
当您的 MainActivity
的 onCreate()
被调用时,会按此顺序发生四件事:
MainActivity
的内容视图是通过膨胀activity_nav.xml
设置的。nav_view
和nav_footer
Kotlin 变量是通过在内容视图中搜索它们来分配的。 (Kotlin does this for you,所以很容易忘记它正在发生。)- 听众已附加到
nav_view
和nav_footer
视图。 MainActivity
的内容视图再次设置,这次是通过膨胀activity_main.xml
。 (activity_main.xml
内的include
标签告诉框架它应该在这个过程中扩充activity_nav.xml
的另一个副本。)旧的内容视图被覆盖。
所以当 MainActivity.onCreate()
完成时,附加了侦听器的视图已经消失了。解决此问题的一种方法是从 NavActivity.onCreate()
中删除行 setContentView(R.layout.activity_nav)
并将其余行移至从 MainActivity.onCreate()
.
initNavDrawerListeners()
方法中