如果使用导航控制器,如何删除一些片段中的底部导航视图和工具栏?

问题描述 投票:3回答:2

我有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>

它将托管一些片段作为底部导航视图的菜单,如HomeFragmentOrderFragmentFavouriteFragmentCartFragmentProfileFragment

像这样:enter image description here

假设HomeFragment中有logOut按钮,如果单击它,它将移动到登录屏幕。像往常一样,登录屏幕或注册屏幕没有底部导航视图,也没有工具栏。

那么,如果使用导航控制器,删除底部导航视图以及工具栏的最佳方法是什么?

我试图在导航控制器图中使用<Include>标签,

所以我制作了两个导航图,然后我制作了2个活动来将片段作为主机。第一个活动有底部导航视图和工具栏(MainActivity,就像我上面分享的xml),另一个活动没有底部导航视图和工具栏

导航图如下图所示:

MainActivity作为导航主机片段enter image description here

AuthActivity作为导航主机片段enter image description here

但是当我使用以下代码从HomeFragment(具有注销按钮)移动到LoginFragment时:

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

        }

但在登录屏幕中,底部导航视图和工具栏仍然存在

我假设auth_graph(AuthActivity作为主机)可用于托管一些没有底部导航视图和工具栏的屏幕,如登录屏幕,注册屏幕或忘记密码屏幕。

但....我无法使用这种方式删除底部导航视图和工具栏

那么如果使用导航控制器,如何删除一些片段中的底部导航视图和工具栏?

android android-jetpack android-architecture-components
2个回答
0
投票

似乎目前在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
    }

-1
投票

我会说实话,我只是阅读了这个问题的标题但是..你不能只是切换可见性吗?把它放在你的MainActivity中。

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

并对工具栏执行相同操作。

© www.soinside.com 2019 - 2024. All rights reserved.