Я на самом деле использую новые компоненты архитектуры в своем приложении и настроил компонент навигации.У меня есть навигационный ящик, и я хочу использовать его с.Я настроил его, но у меня возникают некоторые проблемы:
1 - ящик не закрывается сам.Меню работает и перемещается в нужное место, но не закрывает его после навигации.Мне пришлось добавить destinationChangedListener, чтобы закрыть его самому.
navController.addOnDestinationChangedListener { _, _, _ ->
if (drawer_layout.isDrawerOpen(GravityCompat.START))
drawer_layout.closeDrawer(GravityCompat.START)
}
В кодировках ящик закрывается, и я не совсем понимаю, почему.
2 - Кнопка вверх открывает ящик.Когда я перемещаюсь к фрагменту не верхнего уровня, значок меню меняется на стрелку вверх, но когда я щелкаю по нему, он открывает меню ящика вместо возврата к предыдущему месту назначения.
3 Я бынапример, для некоторых пунктов моего меню, чтобы установить пользовательский на клик.Все кнопки в моем меню не предназначены для перехода в приложение, и я не знаю, где я могу переопределить поведение navController, чтобы сказать ему, что делать, когда он не может перемещаться.
Вот соответствующий код:
ActivityMain.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/layout_app_bar"/>
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_marginTop="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/app_navigation" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<include layout="@layout/layout_navigation_view"/>
</androidx.drawerlayout.widget.DrawerLayout>
</FrameLayout>
Layout_app_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:theme="@style/AppTheme.AppBarOverlay"
xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/language_main_color"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
hook_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/appAction" >
<item
android:id="@+id/bridgeFragment"
android:icon="@drawable/ic_home"
android:title="@string/home" />
<item
android:id="@+id/categoryFragment"
android:icon="@drawable/ic_categories"
android:title="@string/categories" />
<item
android:id="@+id/favoriteFragment"
android:icon="@drawable/ic_favorite"
android:title="@string/favorites" />
<item
android:id="@+id/unlimited"
android:icon="@drawable/ic_unlimited"
android:title="@string/dialog_ask_unlimited_title" />
<!--<item
android:id="@+id/settings"
android:icon="@drawable/ic_settings"
android:title="@string/settings" /> -->
</group>
<group android:id="@+id/globalAction">
<item
android:id="@+id/rate"
android:icon="@drawable/ic_rate"
android:title="@string/rate" />
<item
android:id="@+id/aboutFragment"
android:icon="@drawable/ic_about_me"
android:title="@string/about"/>
</group>
</menu>
MainActivity.kt (setupMenus () и setupView () вызываются в onCreate)
override fun setupView(){
val host: NavHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return
val navController = host.navController
val drawerLayout : DrawerLayout? = findViewById(R.id.drawer_layout)
appBarConfiguration = AppBarConfiguration(
setOf(R.id.bridgeFragment, R.id.categoryFragment, R.id.favoriteFragment, R.id.aboutFragment),
drawerLayout)
setupActionBarWithNavController(navController, appBarConfiguration)
setupNavigationMenu(navController)
navController.addOnDestinationChangedListener { _, _, _ ->
if (drawer_layout.isDrawerOpen(GravityCompat.START))
drawer_layout.closeDrawer(GravityCompat.START)
}
}
fun updateHasMenu(hasMenu: Boolean) { this.hasMenu = hasMenu }
private fun setupNavigationMenu(navController: NavController) {
val sideNavView = findViewById<NavigationView>(R.id.nav_view)
sideNavView?.setupWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration)
}
override fun setupMenus(){
setSupportActionBar(toolbar)
supportActionBar?.let {
it.setDisplayHomeAsUpEnabled(true)
it.setHomeAsUpIndicator(R.drawable.ic_menu)
}
}