Как использовать компонент навигации Android (навигационный график) в макете ящика (с меню ящика навигации)? - PullRequest
1 голос
/ 31 января 2020

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

        <fragment
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        class="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/main_nav_graph"
        app:defaultNavHost="true"/>

У меня есть макет Drawer с меню, я не могу сделать навигацию работать, когда я нажимаю на кнопку навигационного ящика (он работает из основного фрагмента, но не когда я нажимаю на кнопки «Ящик»), если я использую старый способ программирования навигационного ящика с помощью: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new_fragment).commit();, мой navcontroller теряется !! и я получаю ошибки, такие как

целевой фрагмент в неизвестном от navcontroller, потому что контроллер увидит домашний фрагмент как отображаемый в данный момент, даже если это не так (из отладки)

public boolean onNavigationItemSelected(MenuItem item) {

        switch (item.getItemId()){
            case R.id.action_1:
                //doesn't work when it current fragment doesnt match the 
                //action_fromfragmentx_to_fragmenty
                Navigation.findNavController(this,R.id.fragment_container)
                .navigate(R.id.action_fromfragmentx_to_fragmenty);
                break;

            //Other menu options...
        }

Отсюда мой вопрос: как мне переопределить этот onNavigationItemSelected в Java, чтобы компонент навигации работал? Любая ссылка или родственник делать c об этой теме (в Java)?.

1 Ответ

2 голосов
/ 31 января 2020

Компонент Navigation предлагает вспомогательный класс в NavigationUI в артефакте navigation-ui. Согласно Обновлению компонентов пользовательского интерфейса с навигационной документацией для ящиков навигации , вы можете использовать метод setupWithNavController(), чтобы автоматически подключать пункты меню к пунктам навигации, которые вы настроили в своем графике навигации, связывая пункт назначения пункт к пункту меню :

Если идентификатор MenuItem совпадает с идентификатором пункта назначения, NavController может затем перейти к этому пункту назначения.

Следовательно, вам вообще не нужна реализация onNavigationItemSelected, и вам не нужно выполнять FragmentTransactions. Просто убедитесь, что android:id="@+id/fragment_y" в вашем меню XML соответствует android:id="@+id/fragment_y" в вашей навигации XML и наберите setupWithNavController():

NavigationView navView = findViewById(R.id.nav_view);
// This is what sets up its own onNavigationItemSelected
NavigationUI.setupWithNavController(navView, navController);
...