NavigationUI BottomNavigationView: как заставить элемент начать действие без выделения самого элемента - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть BottomNavigationView с 4 элементами меню, три элемента перемещаются по разным фрагментам, что довольно просто. но четвертый MenuItem начнет новое действие.

Теперь я достиг этого, используя тег <activity> вместо <fragment>, например:

mobile_navigation. xml

<?xml version="1.0" encoding="utf-8"?>
<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/mobile_nav"
    app:startDestination="@+id/nav_fragment1">

    <fragment
        android:id="@+id/nav_fragment1"
        android:name="com.test.testapp.FragmentOne"
        android:label="@string/title_fragment1"
        tools:layout="@layout/fragment1" />

    <fragment
        android:id="@+id/nav_fragment2"
        android:name="com.test.testapp.FragmentTwo"
        android:label="@string/title_fragment2"
        tools:layout="@layout/fragment2" />

    <fragment
        android:id="@+id/nav_fragment3"
        android:name="com.test.testapp.FragmentThree"
        android:label="@string/title_fragment3"
        tools:layout="@layout/fragment3" />

    <activity
        android:id="@+id/nav_activity1"
        android:name="com.test.testapp.ActivityOne"
        android:label="@string/title_activity1"
        tools:layout="@layout/activity1" />
</navigation>

ActivityBase. java

BottomNavigationView navView = findViewById(R.id.nav_view);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_fragment1, R.id.nav_fragment2, R.id.nav_fragment3, R.id.nav_activity1)
                .build();
NavController navController = Navigation.findNavController(this, R.id.nav_host);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);

, но когда я нажимаю кнопку "Назад", он выделяет элемент меню nav_activity1, сопоставленный с действием, и показывает фрагмент nav_fragment1 в контейнере.

Я хочу, чтобы он выделил последний посещенный фрагмент перед нажатием на элемент меню nav_activity1 и показал, что вместо этого, когда пользователь завершил работу с ActivityOne.

Я достиг этого до сих пор с помощью этого кода:

ActivityBase. java

navView.setOnNavigationItemSelectedListener((@NonNull MenuItem item) -> {
            switch (item.getItemId()) {
                case R.id.nav_fragment1: {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.nav_host, new FragmentOne())
                            .commit();
                    return true;
                }
                case R.id.nav_fragment2: {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.nav_host_fragment, new FragmentTwo())
                            .commit();
                    return true;
                }
                case R.id.nav_fragment3: {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.nav_host_fragment, new FragmentThree())
                            .commit();
                    return true;
                }
                case R.id.nav_activity1: {
                    startActivity(new Intent(ActivityBase.this, ActivityOne.class));
                    return false;
                }
            }

            return false;

        });

Но я ищу более элегантный способ, если это возможно, используя навигационные компоненты

...