Абстрактный навигационный ящик 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>

Я думал, что это как-то связано с назначением mDrawerLayout в дочернем классе, но это ничего не исправило. Однако он никогда не вызывает слушателей, независимо от того, сколько вы щелкаете по нему, он даже не будет печатать журналы в этом слушателе.

Любая помощь приветствуется, так как я не могу понять это хоть убей, заранее спасибо!

0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вызывается MainActivity вашего onCreate(), в этом порядке происходят четыре вещи:

  1. Просмотр содержимого MainActivity устанавливается путем надувания activity_nav.xml.
  2. Переменные nav_view и nav_footer Kotlin назначаются путем поиска их в представлении содержимого. (Котлин сделает это за вас, поэтому легко забыть, что это происходит.)
  3. Слушатели прикреплены к представлениям nav_view и nav_footer.
  4. Просмотр содержимого MainActivity снова устанавливается, на этот раз путем раздувания activity_main.xml. (Тег include внутри activity_main.xml сообщает платформе, что она должна создать еще одну копию activity_nav.xml как часть процесса.) Старое представление содержимого перезаписывается.

Таким образом, к моменту завершения MainActivity.onCreate() просмотры с прикрепленными слушателями исчезнут. Один из способов решить проблему - удалить строку setContentView(R.layout.activity_nav) из NavActivity.onCreate() и переместить оставшуюся часть в метод initNavDrawerListeners(), который вызывается из MainActivity.onCreate().

Другие вопросы по теме