Передавая данные между фрагментами из пункта меню панели инструментов, кликните, используя Navigation - Kotlin - PullRequest
0 голосов
/ 01 июля 2018

Я настроил свое приложение, используя компонент архитектуры навигации. Переход от одного фрагмента к следующему фрагменту работает нормально. Однако я застрял, пытаясь передать данные в этом навигационном потоке.

Следуя структуре приложения Навигация кодовой метки , я использую приведенный ниже код для перехода от одного фрагмента к другому по элементу меню. Нажмите:

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)
        ...

Есть что-то, что я пропускаю? Или это может быть ошибка с навигацией?

1 Ответ

0 голосов
/ 02 июля 2018

Вы должны использовать 'NavHostFragment.findNavController ()':

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    when (item?.itemId) { 
        R.id.menu_edit -> { 
            val songBundle = Bundle() 
            songBundle.putString("nameArg", first_name.text.toString()) 
            NavHostFragment.findNavController(nav_host_fragment).navigate(R.id.goto_songedit, songBundle) 
            return true 
        } 
        else -> return super.onOptionsItemSelected(item) 
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...