代码之家  ›  专栏  ›  技术社区  ›  Alexa289

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

  •  1
  • Alexa289  · 技术社区  · 7 年前

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

    家庭片段 ,如果单击它,则它将移动到登录屏幕。通常,登录屏幕或注册屏幕没有底部导航视图,也没有工具栏。

    我试着用 <Include>

    所以我制作了两个导航图,然后制作了两个活动来放置片段作为宿主。第一个活动有底部导航视图和工具栏(MainActivity,如我在上面共享的xml),而另一个活动没有底部导航视图和工具栏

    导航图如下图所示:

    作为nav宿主片段的MainActivity enter image description here

    AuthActivity作为nav宿主片段 enter image description here

    但是当我离开 家庭片段 (有注销按钮)到 LoginFragment 使用此代码:

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

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

    但是…我不能用这种方法删除底部导航视图和工具栏

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

    1 回复  |  直到 7 年前
        1
  •  7
  •   Rvb84    6 年前

    更简洁的方法是使用navigationlistener。这样,您只需要在main活动中使用一个函数,而不需要在所有要隐藏bottomnavigation或任何其他UI元素(如toolbar)的片段中使用代码。将此函数放在从MainActivity创建的onCreate中。

    我的功能如下:

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

    我用 Kotlin Android Extensions

        2
  •  0
  •   loics2    7 年前

    目前在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
        }
    
        3
  •  -1
  •   Algar    7 年前

    老实说,我只是读了这个问题的标题,但是。。你就不能切换可见性吗?把这个放在你的主要活动中。

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

    推荐文章