SetupWithNavController не работает для панели инструментов

Я пытаюсь привязать панель инструментов к контроллеру навигации, для этого использую следующий код:

NavigationUI.setupWithNavController(toolbar, NavHostFragment.findNavController(nav_host))

а в файле меню я предоставил идентификатор фрагмента, к которому приложение должно переходить следующим образом:

<item
    android:id="@+id/menuFragment"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never" />

и у меня есть простой файл графа навигации, например:

<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/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.vapoyan.myapplication.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_homeFragment_to_menuFragment"
            app:destination="@id/menuFragment" />
    </fragment>

    <fragment
        android:id="@+id/menuFragment"
        android:name="com.vapoyan.myapplication.MenuFragment"
        android:label="fragment_menu"
        tools:layout="@layout/fragment_menu" />
</navigation>

Есть ли у кого-нибудь опыт или может подсказать, как я могу решить проблему, и поддерживается ли панель инструментов компонентом навигации?

Любой пример кода или ссылки?


person Community    schedule 23.11.2018    source источник


Ответы (3)


Наконец, я нашел решение благодаря Google CodeLab

Чего мне не хватало, так это:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
     return NavigationUI.onNavDestinationSelected(item, NavHostFragment.findNavController(nav_host))
            || super.onOptionsItemSelected(item)
}

Кроме того, если вы хотите иметь поддержку кнопки возврата, вам нужно onCreate добавить:

NavigationUI.setupWithNavController(toolbar, NavHostFragment.findNavController(nav_host))

В принципе, в моем понимании просто bt предоставление id правильного фрагмента для пункта меню и вызов setupWithNavController должен работать, но это предположение было неверным, или, возможно, в текущей версии (1.0.0-alpha07) Ребята из Google что-то изменили. Итак, теперь он работает нормально.

Если вы видите, что есть способ сделать это короче :) или лучше :) дайте мне знать.

person Community    schedule 23.11.2018
comment
Это побочное упоминание в документации, но по умолчанию используется навигация по меню с NavigationUI.onNavDestinationSelected(), чтобы стереть ваш бэкстэк. Чтобы исправить это, вам нужно установить android:menuCategory="secondary" в пунктах меню XML. - person smdufb; 15.10.2019

В дополнение к приведенному выше ответу. Убедитесь, что идентификаторы навигации и элемента совпадают.

android:id="@+id/menuFragment"

Я зациклился на этом, потому что у меня был отдельный идентификатор для каждого элемента.

person tzg    schedule 28.10.2019
comment
Спасибо большое! Похоже, это не было задокументировано. - person nLL; 23.02.2020
comment
Большое спасибо tzg, Ты делаешь мой день. - person Dante; 23.06.2020

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

На данный момент я использую эти библиотеки Android: в моем build.gradle

 implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha07'
 implementation 'android.arch.navigation:navigation-ui:1.0.0-alpha07'

В моей деятельности

class MainActivity : BaseActivity() {

    @SuppressLint("RestrictedApi")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val navController = Navigation.findNavController(this, /*ur nav controller ID*/)

        // Set up ActionBar
        setSupportActionBar(/*ur toolbar*/)

        NavigationUI.setupActionBarWithNavController(this, navController)
    }
}

Вы можете проверить документацию здесь. Вы можете найти дополнительную информацию: https://developer.android.com/topic/libraries/architecture/navigation/navigation-ui#create_a_toolbar

person Catluc    schedule 23.11.2018
comment
Я нашел решение. Мне не хватало звонка на override fun onOptionsItemSelected(item: MenuItem): Boolean { return NavigationUI.onNavDestinationSelected(item, NavHostFragment.findNavController(nav_host)) || super.onOptionsItemSelected(item) } - person ; 23.11.2018