ナビゲーションコントローラーのホストとして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
のような下部ナビゲーションビューのメニューとしていくつかのフラグメントをホストします。
HomeFragment
にlogOutボタンがあるとしましょう。クリックすると、ログイン画面に移動します。通常どおり、ログイン画面またはサインアップ画面には下部ナビゲーションビューがなく、ツールバーもありません。
ナビゲーションコントローラーを使用している場合、その下部のナビゲーションビューとツールバーを削除する最良の方法は何ですか?
ナビゲーションコントローラグラフで<Include>
タグを使用しようとしましたが、
2つのナビゲーショングラフを作成してから、フラグメントをホストとして配置する2つのアクティビティを作成します。最初のアクティビティには下部のナビゲーションビューとツールバーがあり(MainActivity、上記で共有したXMLのように)、他のアクティビティには下部のナビゲーションビューとツールバーがありません
ナビゲーショングラフは次の画像のようになります。
ナビゲーションホストフラグメントとしてのMainActivity
ナビゲーションホストフラグメントとしてのAuthActivity
しかし、私がHomeFragment
(ログアウトボタンがある)からLoginFragment
に移動すると、次のコードが使用されます。
logout_button.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.action_toAuthActivity)
}
ログイン画面では、下部のナビゲーションビューとツールバーはまだそこにあります
Auth_graph(ホストとしてのAuthActivity)を使用して、ログイン画面、サインアップ画面、パスワードを忘れた画面など、下部のナビゲーションビューやツールバーがない画面をホストできると思います。
しかし...この方法では、下部のナビゲーションビューとツールバーを削除できません
ナビゲーションコントローラーを使用している場合、一部のフラグメントで下部ナビゲーションビューとツールバーを削除するにはどうすればよいですか?
もっと簡潔には、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は不要)。
現在、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
}