Как стабилизировать навигацию в приложении Android (Navigation Component + DrawerLayout)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как стабилизировать навигацию в приложении Android (Navigation Component + DrawerLayout)

Сообщение Anonymous »

Я думаю, что структура навигации в моем приложении устарела и очень нестабильна. У меня проблема с частыми исключениями этого типа:

Код: Выделить всё

Fatal Exception: java.lang.IllegalArgumentException: Navigation action/destination com.company.myApp:id/action_mainFragment_to_churchListFragment cannot be found from the current destination k0(com.company.myApp:id/nav_graph) startDestination={c(com.company.myApp:id/mainFragment) label=MainFragment class=com.company.myApp.MainFragment}
at androidx.navigation.NavController.navigate(NavController.android.kt:904)
at androidx.navigation.NavController.navigate(NavController.android.kt:816)
at androidx.navigation.NavController.navigate(NavController.android.kt:797)
at androidx.navigation.NavController.navigate(NavController.android.kt:782)
at com.company.myApp.MainActivity.churchOnClick$lambda$20(MainActivity.kt:536)
at com.company.myApp.MainActivity.goNext(MainActivity.kt:466)
at com.company.myApp.MainActivity.churchOnClick(MainActivity.kt:532)
at com.company.myApp.NavigationListener$DefaultImpls.churchOnClick$default(NavigationListener.kt:11)
at com.company.myApp.MainFragment.initOnClickListeners$lambda$12(MainFragment.kt:131)
at android.view.View.performClick(View.java:8508)
at android.view.View.performClickInternal(View.java:8485)
at android.view.View.-$$Nest$mperformClickInternal()
at android.view.View$PerformClick.run(View.java:33213)
at android.os.Handler.handleCallback(Handler.java:995)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loopOnce(Looper.java:273)
at android.os.Looper.loop(Looper.java:363)
at android.app.ActivityThread.main(ActivityThread.java:10060)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
Вот как я размещаю навигацию с помощью Drawer в Activity_main.xml. Затем я реализую это в MainActivity:

Код: Выделить всё

private fun setNavigationView() {
setNavigationViewHeader()
setNavigationViewMenu()
binding.navigationView.setNavigationItemSelectedListener { item ->
if (item.isChecked) {
true
} else {
when (item.itemId) {
NavigationDrawerUtils.myParishMenuItemId -> {
NavigationDrawerUtils.uncheckAllItems(binding.navigationView)
item.isChecked = true
binding.drawerLayout.closeDrawers()
navController.popBackStack(R.id.mainFragment, false)
navController.navigate(R.id.myParishFragment)
}

NavigationDrawerUtils.myDioceseMenuItemId ->  {
NavigationDrawerUtils.uncheckAllItems(binding.navigationView)
item.isChecked = true
binding.drawerLayout.closeDrawers()
navController.popBackStack(R.id.mainFragment, false)
navController.navigate(R.id.myDioceseFragment)
}
Внутри фрагментов я использую интерфейс для навигации:

Код: Выделить всё

private var trailPointsListener: TrailPointsListener? = null

trailPointsListener?.onTrailPointsTrailClick(churchId)

override fun onAttach(context: Context) {
super.onAttach(context)
if (context is TrailPointsListener) {
trailPointsListener = context

} else {
throw IllegalStateException("$context must implement ChurchListListener")
}
}
и в MainActivity я реализую эти интерфейсы:

Код: Выделить всё

override fun onTrailPointsTrailClick(id: Int) {
val direction =
TrailPointFragmentDirections.actionTrailPointFragmentToChurchDetailsFragment(id)
navController.navigate(direction)
}
Я читал, что навигация должна работать на стороне фрагмента. Если потребуется изменение архитектуры, я был бы признателен за предложения по новой архитектуре (для компонентов навигации). В моем приложении часто используется навигация, и мне хотелось бы избежать беспорядка в коде.


Подробнее здесь: https://stackoverflow.com/questions/798 ... mponent-dr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»