Я пытаюсь абстрагироваться от своего навигационного ящика, чтобы оптимизировать приложение для 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>
Я думал, что это как-то связано с назначением mDrawerLayout в дочернем классе, но это ничего не исправило. Однако он никогда не вызывает слушателей, независимо от того, сколько вы щелкаете по нему, он даже не будет печатать журналы в этом слушателе.
Любая помощь приветствуется, так как я не могу понять это хоть убей, заранее спасибо!
Когда вызывается MainActivity вашего onCreate(), в этом порядке происходят четыре вещи:
MainActivity устанавливается путем надувания activity_nav.xml.nav_view и nav_footer Kotlin назначаются путем поиска их в представлении содержимого. (Котлин сделает это за вас, поэтому легко забыть, что это происходит.)nav_view и nav_footer.MainActivity снова устанавливается, на этот раз путем раздувания activity_main.xml. (Тег include внутри activity_main.xml сообщает платформе, что она должна создать еще одну копию activity_nav.xml как часть процесса.) Старое представление содержимого перезаписывается.Таким образом, к моменту завершения MainActivity.onCreate() просмотры с прикрепленными слушателями исчезнут. Один из способов решить проблему - удалить строку setContentView(R.layout.activity_nav) из NavActivity.onCreate() и переместить оставшуюся часть в метод initNavDrawerListeners(), который вызывается из MainActivity.onCreate().