Я как раз работал над этим и у меня есть решение, которое прослушивает щелчки панели навигации и реагирует так же, как и на кнопку.
Я использую одно действие с несколькими фрагментами. Обязательно настройте навигационный график для ваших фрагментов, затем вызовите правильное действие FragmentDirections
, используя setNavigationItemSelectedListener
в основном действии.
В моем примере settingsFragment
будет загружен с анимация, но aboutFragment
не будет, так как она не вызывает функцию Directions.action
.
MainActivity (внутри функции onCreate)
/** Handle clicks in Nav Drawer **/
val navigationView = findViewById<NavigationView>(R.id.navView)
navigationView.setNavigationItemSelectedListener { menuItem ->
Timber.d("Nav Drawer Item Clicked: %s", menuItem.title)
when (menuItem.itemId) {
R.id.settingsFragment -> {
navController.navigate(
RecipeListFragmentDirections
.actionRecipeListToSettingsFragment()
)
}
R.id.aboutFragment -> {
navController.navigate(R.id.aboutFragment)
}
R.id.refreshRecipes -> {
Timber.i("TODO: Implement repository refresh method call")
}
}
true
}
навигация. xml
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/navigation"
app:startDestination="@id/recipeList">
<fragment
android:id="@+id/recipeList"
android:name="com.jumptuck.recipebrowser2.recipelist.RecipeListFragment"
tools:layout="@layout/fragment_recipe_list">
<action
android:id="@+id/action_recipeList_to_singleRecipeFragment"
app:destination="@id/singleRecipeFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_right"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_left" />
<action
android:id="@+id/action_recipeList_to_aboutFragment"
app:destination="@id/aboutFragment"
app:enterAnim="@anim/slide_in_left"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_right"
app:popExitAnim="@anim/slide_out_right" />
<action
android:id="@+id/action_recipeList_to_settingsFragment"
app:destination="@id/settingsFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_right"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_left" />
</fragment>
Одна из причин, по которой я использовал этот подход, заключается в том, что я хочу запустить службу из пункта меню refreshRecipes
, а не вызывать навигацию, и это перехватывает щелчок. Одним из недостатков является то, что сами элементы панели навигации не показывают анимацию при нажатии (однако я думаю, что это можно исправить).