Android Jetpack 导航:一个 activity 具有多个导航视图
Android Jetpack navigation: One activity with several navigation views
我正在考虑新的 android jetpack navigation best practices,每个应用程序中应该只有一个 activity。我想用一个 activity 分片实现以下菜单,但我对在同一个应用程序中实现多个菜单时的最佳实践感到非常不确定。
BottomNavigationView
(Reference repo):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.navigationadvancedsample.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav"/>
</LinearLayout>
截图:
DrawerLayout (Reference repo):
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:id="@+id/garden_nav_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_garden"/>
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation_view"
style="@style/Widget.MaterialComponents.NavigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/menu_navigation"/>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
截图:
考虑到 google 中的这些示例,关于如何使用最佳实践在一个 activity 中实现两个视图没有明确的答案,因为每个示例只为其应用使用一种形式的导航视图, 分别是 DrawerLayout
, 或 BottomNavigationView
.
问题是:
1. 为不同片段制作不同导航视图的 activity 的最佳实践是什么?例如,几个片段使用 DrawerLayout
,而其他片段使用 BottomNavigationView
。
2. 如果想在查看认证视图和登录时隐藏DrawerLayout
和BottomNavigationView
,认证时显示
怎么办?
您可以同时实现它们,并且可以通过编程方式隐藏或显示它们,或者在 activity 之前拥有一个身份验证视图,该视图包含没有 <include/>
这些导航组件的导航。
使用 Jetpack Navigation,您可以在主 Activity 中添加一个导航主机和一个与主导航图连接的导航抽屉,以及一个连接到第二个导航图的底部导航的导航主机默认起始片段。
我找到了这个教程 https://proandroiddev.com/android-jetpack-navigationui-a7c9f17c510e and its example project https://github.com/sagar-viradiya/NavigationUIDemo
我正在考虑新的 android jetpack navigation best practices,每个应用程序中应该只有一个 activity。我想用一个 activity 分片实现以下菜单,但我对在同一个应用程序中实现多个菜单时的最佳实践感到非常不确定。
BottomNavigationView
(Reference repo):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.navigationadvancedsample.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav"/>
</LinearLayout>
截图:
DrawerLayout (Reference repo):
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:id="@+id/garden_nav_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_garden"/>
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation_view"
style="@style/Widget.MaterialComponents.NavigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/menu_navigation"/>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
截图:
考虑到 google 中的这些示例,关于如何使用最佳实践在一个 activity 中实现两个视图没有明确的答案,因为每个示例只为其应用使用一种形式的导航视图, 分别是 DrawerLayout
, 或 BottomNavigationView
.
问题是:
1. 为不同片段制作不同导航视图的 activity 的最佳实践是什么?例如,几个片段使用 DrawerLayout
,而其他片段使用 BottomNavigationView
。
2. 如果想在查看认证视图和登录时隐藏DrawerLayout
和BottomNavigationView
,认证时显示
您可以同时实现它们,并且可以通过编程方式隐藏或显示它们,或者在 activity 之前拥有一个身份验证视图,该视图包含没有 <include/>
这些导航组件的导航。
使用 Jetpack Navigation,您可以在主 Activity 中添加一个导航主机和一个与主导航图连接的导航抽屉,以及一个连接到第二个导航图的底部导航的导航主机默认起始片段。 我找到了这个教程 https://proandroiddev.com/android-jetpack-navigationui-a7c9f17c510e and its example project https://github.com/sagar-viradiya/NavigationUIDemo