как удалить нижний вид навигации и панель инструментов в некоторых фрагментах при использовании контроллера навигации? - PullRequest
0 голосов
/ 04 февраля 2019

У меня MainActivity в качестве хоста моего контроллера навигации, он имеет панель инструментов и нижнюю панель навигации

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:theme="?attr/actionBarTheme"
            android:minHeight="?attr/actionBarSize"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>


    <fragment
            android:id="@+id/nav_host_fragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toTopOf="@+id/bottom_nav"
            app:layout_constraintTop_toBottomOf="@+id/toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/navigation_graph"
            app:defaultNavHost="true"
    />


    <android.support.design.widget.BottomNavigationView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:background="@color/colorPrimary"
            app:itemIconTint="@color/color_bottom_view_navigation"
            app:itemTextColor="@color/color_bottom_view_navigation"
            app:menu="@menu/menu_bottom_view"
            app:labelVisibilityMode="labeled"
            android:id="@+id/bottom_nav"/>




</android.support.constraint.ConstraintLayout>

в нем будут размещаться некоторые фрагменты в виде меню для нижней панели навигации, например HomeFragment, OrderFragment, FavouriteFragment, CartFragment, ProfileFragment.

примерно так: enter image description here

допустим, есть кнопка logOut в HomeFragment, иесли щелкнуть, то он перейдет на экран входа в систему.как обычно, экран входа или регистрации не имеет нижнего вида навигации, а также не имеет панели инструментов.

, так как лучше всего удалить этот нижний вид навигации, а также панель инструментов при использовании навигацииконтроллер?

Я пытался использовать тег <Include> в моем графике контроллера навигации,

, поэтому я делаю два графика навигации, затем я делаю 2 действия, чтобы разместить фрагмент в качестве хоста.первое действие имеет нижнюю навигационную панель и панель инструментов (MainActivity, как XML, которым я делюсь выше), а другая деятельность не имеет нижней навигационной панели и панели инструментов

график навигации похож на изображение ниже:

MainActivity как фрагмент хоста Nav enter image description here

AuthActivity как фрагмент хоста Nav enter image description here

, но при переходе с HomeFragment (с кнопкой выхода из системы) до LoginFragment с использованием этого кода:

logout_button.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.action_toAuthActivity)

        }

, но на экране входа в систему отображается нижняя навигационная панель и панель инструментов

Я предполагаю auth_graph (AuthActivityв качестве хоста) может использоваться для размещения экрана, который не имеет нижней навигационной панели и панели инструментов, например экран входа в систему, экран регистрации или экран забытого пароля.

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

, так как удалить нижний навигационный вид и панель инструментов в некоторых фрагментах при использовании контроллера навигации?

Ответы [ 3 ]

0 голосов
/ 23 апреля 2019

Похоже, что в настоящее время в NavigationUI нет простого решения.

В итоге я добавил метод hideBottomBar в MainActivity, например:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        hideBottomBar(false); // to have it visible by default
    }

    public void hideBottomBar(boolean isHidden){
         bottomBar.setVisibility(isHidden ? View.GONE : View.VISIBLE);
    }

Изатем во фрагментах, где должна быть скрыта нижняя строка:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // layout inflating and stuff...

        MainActivity activity = (MainActivity) getActivity();
        if (activity != null)
            activity.hideBottomBar(true);

        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        MainActivity activity = (MainActivity) getActivity();
        if (activity != null)
            activity.hideBottomBar(false);    // to show the bottom bar when
                                              // we destroy this fragment
    }
0 голосов
/ 15 июля 2019

Более кратким является использование навигационного прослушивателя.Таким образом, вам нужна только 1 функция в вашей MainActivity и нет кода во всех фрагментах, где вы хотите скрыть нижнюю навигацию или любой другой элемент пользовательского интерфейса (например, панель инструментов).Поместите эту функцию в свой onCreate из MainActivity.

Моя функция выглядит следующим образом:

private fun visibilityNavElements(navController: NavController) {
    navController.addOnDestinationChangedListener { _, destination, _ ->
        when (destination.id) {
            R.id.about_fragment -> bottom_nav?.visibility = View.GONE
            R.id.settings_fragment -> bottom_nav?.visibility = View.GONE
            R.id.detail_fragment -> bottom_nav?.visibility = View.GONE
            R.id.missionPhotoFragment -> bottom_nav?.visibility = View.GONE
            else -> bottom_nav?.visibility = View.VISIBLE
        }
    }
}

Я использую Расширения Kotlin Android для прямого доступа к просмотрам по их идентификатору (не требуется findViewById).

0 голосов
/ 04 февраля 2019

Я буду честен, я только что прочитал заголовок к этому вопросу, но .. Разве вы не можете просто переключить видимость?Поместите это в свой MainActivity.

fun toggleBottomNavigation(visible: Boolean) {
    bottomNavigationView.visibility = if (visible) {
        View.VISIBLE
    } else {
        View.GONE
    }
}

и сделайте то же самое для панели инструментов.

...