web-dev-qa-db-ja.com

ナビゲーションコントローラーを使用している場合、一部のフラグメントで下部のナビゲーションビューとツールバーを削除する方法

ナビゲーションコントローラーのホストとして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つのナビゲーショングラフを作成してから、フラグメントをホストとして配置する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)を使用して、ログイン画面、サインアップ画面、パスワードを忘れた画面など、下部のナビゲーションビューやツールバーがない画面をホストできると思います。

しかし...この方法では、下部のナビゲーションビューとツールバーを削除できません

ナビゲーションコントローラーを使用している場合、一部のフラグメントで下部ナビゲーションビューとツールバーを削除するにはどうすればよいですか?

9
Alexa289

もっと簡潔には、navigationlistenerを使用します。この方法では、MainActivityに1つの関数のみが必要で、bottomnavigationまたはその他のUI要素(ツールバーなど)を非表示にするすべてのフラグメントにコードは必要ありません。この関数を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 を使用して、そこのIDでビューに直接アクセスします(findViewByIdは不要)。

7
Rvb84

現在、NavigationUIに実装されている単純なソリューションはないようです。

私がやったことは、hideBottomBarMainActivityメソッドを追加することです:

    @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
loics2