Я настроил свое приложение, используя компонент архитектуры навигации. Переход от одного фрагмента к следующему фрагменту работает нормально. Однако я застрял, пытаясь передать данные в этом навигационном потоке.
Следуя структуре приложения Навигация кодовой метки , я использую приведенный ниже код для перехода от одного фрагмента к другому по элементу меню. Нажмите:
MainActivity.kt
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return NavigationUI.onNavDestinationSelected(item,
Navigation.findNavController(this, R.id.nav_host_fragment))
|| super.onOptionsItemSelected(item)
}
Я попытался передать пакет, изменив код следующим образом. Android Studio не обнаруживает никаких ошибок, но мое приложение вылетает при попытке выполнить щелчок по этому пункту меню. Обратите внимание, что я передаю R.id.menu_edit
в качестве параметра в findNavController
, потому что в противном случае я получаю сообщение об ошибке «Нет значения для параметра viewId» - но я думаю, что вы обычно вызываете это, не передавая ничего.
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item?.itemId) {
R.id.menu_song_edit -> {
val songBundle = Bundle()
songBundle.putString("titleArg", song_title.toString())
this.findNavController(R.id.menu_song_edit).navigate(R.id.goto_songedit, songBundle) // *** this is line 96 where it crashes per the log ***
return true
}
else -> return NavigationUI.onNavDestinationSelected(item,
Navigation.findNavController(this, R.id.nav_host_fragment))
|| super.onOptionsItemSelected(item)
}
}
Журнал от аварии ниже. NavController не был найден?
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.projects.arise.mytestapp, PID: 1162
java.lang.IllegalStateException: Activity com.projects.arise.mytestapp.MainActivity@58f00cb does not have a NavController set on 2131230836
at androidx.navigation.Navigation.findNavController(Navigation.java:60)
at androidx.navigation.ActivityKt.findNavController(Activity.kt:30)
at com.projects.arise.mytestapp.MainActivity.onOptionsItemSelected(MainActivity.kt:96)
at android.app.Activity.onMenuItemSelected(Activity.java:3204)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:407)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:63)
at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:203)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) Disconnected from the target VM, address: 'localhost:8610', transport: 'socket'
Затем я попытался переопределить onOptionsItemSelected
во фрагменте, который вместо этого передает данные, но, похоже, не имел никакого эффекта. Я предполагаю, что это потому, что он уже перехватывается тем же методом в MainActivity.kt выше.
Код, который я имел во фрагменте отправки данных, был следующим. Идентификатор ресурса 'goto_detailsedit' относится к идентификатору action
в навигационном файле nav_graph.xml.
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_edit -> {
val songBundle = Bundle()
songBundle.putString("nameArg", first_name.text.toString())
this.findNavController().navigate(R.id.goto_songedit, songBundle)
return true
}
else -> return super.onOptionsItemSelected(item)
}
}
Может кто-нибудь помочь мне с синтаксической ошибкой новобранца в приведенном выше коде MainActivity.kt?
ОБНОВЛЕНИЕ 2 июля 2018
Повторно просматривая документацию , я обнаружил, что синтаксис должен быть следующим - мне нужно сослаться на представление:
view.findNavController().navigate(R.id.confirmationAction, bundle)
Я уже настроил панель инструментов в onCreate
в основном упражнении, позвонив по номеру:
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
Поэтому я попытался ссылаться на панель инструментов, заменив this
на toolbar
:
toolbar.findNavController().navigate(R.id.goto_songedit, songBundle)
Редактор кода Android Studio теперь доволен этим, но мое приложение все еще падает. В журнале говорится, что NavController еще не настроен:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.projects.arise.mytestapp, PID: 2670
java.lang.IllegalStateException: View android.support.v7.widget.Toolbar{d03bbdd V.E...... ........ 0,0-1080,147 #7f0800e0 app:id/toolbar} does not have a NavController set
at androidx.navigation.Navigation.findNavController(Navigation.java:83)
at androidx.navigation.ViewKt.findNavController(View.kt:28)
at com.projects.arise.mytestapp.MainActivity.onOptionsItemSelected(MainActivity.kt:96)
...
Есть что-то, что я пропускаю? Или это может быть ошибка с навигацией?