gpt4 book ai didi

android - 如何在 Android 中使用 Navigation Drawer 设置 Navigation Component?

转载 作者:行者123 更新时间:2023-11-29 22:38:19 24 4
gpt4 key购买 nike

如何设置带抽屉导航的导航组件?如何在我的应用中使用它?

一个 Activity 可以完成所有事情吗?

如何仅使用一个 Activity 和具有动态工具栏可见性的 fragment 来处理工具栏可见性。此外,还有一些 fragment 需要我关闭抽屉并使其无法访问。

这个问题是一个 self 回答的问题,与其说是现实生活中的 QA,不如说是教程。

最佳答案

How do I set up navigation component with navigation drawer?

How do I use it in my app?

当涉及到导航组件时,抽屉导航的设置略有不同。

请注意,如果您使用抽屉式导航创建新应用,则不需要当前教程。但是,如果您决定在应用程序的后期添加抽屉,我将在这里解释一些可能看起来很奇怪的事情

首先,您需要设置 activity_main.xmlMainActivity 以便为导航架构做好准备:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

app_bar_main 只是:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"
tools:context=".MainActivity">

<com.google.android.material.appbar.AppBarLayout
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"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</com.google.android.material.appbar.AppBarLayout>

<include layout="@layout/content_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

content_main 是您的 fragment 将被保存的地方:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main">

<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>

您应该知道的事情: Activity 不得在 AndroidManifest.xml 上设置 AppBar:

android:theme="@style/AppTheme.NoActionBar"

如果您注意到 NavigationView 标记中的 app:menu="@menu/activity_main_drawer", fragment 名称应该与它们在 中的名称相同mobile_navigation.xml:

<group android:checkableBehavior="single">
<item
android:id="@+id/homeFragment"
android:icon="@drawable/ic_menu_camera"
android:title="@string/menu_home" />
<item
android:id="@+id/galleryFragment"
android:icon="@drawable/ic_menu_gallery"
android:title="@string/menu_gallery" />
<item
android:id="@+id/slideshowFragment"
android:icon="@drawable/ic_menu_slideshow"
android:title="@string/menu_slideshow" />
<item
android:id="@+id/toolsFragment"
android:icon="@drawable/ic_menu_manage"
android:title="@string/menu_tools" />
</group>

<item android:title="Communicate">
<menu>
<item
android:id="@+id/shareFragment"
android:icon="@drawable/ic_menu_share"
android:title="@string/menu_share" />
<item
android:id="@+id/sendFragment"
android:icon="@drawable/ic_menu_send"
android:title="@string/menu_send" />
</menu>
</item>

</menu>

这样,根据下面将要解释的内容,将无需调用 onCreateOptionsMenu 来检测点击。 Android 团队已经为我们解决了这个问题。按照下面。

到目前为止,这与我们实际使用的通常抽屉设置并没有太大区别。但是,我们需要在应用程序的逻辑部分进行一些配置。因此,让我们打开 MainActivity.kt。首先你需要这些:

  private var appBarConfiguration: AppBarConfiguration? = null
private var drawerLayout: DrawerLayout? = null
private var toolbar: Toolbar? = null
private var navController: NavController? = null

之后,在您的 onCreate 方法中:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar) //set the toolbar

drawerLayout = findViewById(R.id.drawer_layout)
val navView: NavigationView = findViewById(R.id.nav_view)
navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.homeFragment,
R.id.galleryFragment,
R.id.slideShowFragment,
R.id.toolsFragment,
R.id.shareFragment,
R.id.sendFragment,
R.id.loginFragment,
R.id.phoneConfirmationFragment
), drawerLayout
)

setupActionBarWithNavController(navController!!, appBarConfiguration!!) //the most important part
navView.setupWithNavController(navController!!) //the second most important part

//other things unrelated
}

让我们看看这里发生了什么:

首先,您需要引用 navControllerAppBarConfiguration 只是一个类,它包含将作为顶级目标打开的 fragment 。这意味着将在它们之后打开的 fragment 将从 fragment 返回堆栈中释放当前 fragment 。重要的是要告诉 AppBarConfiguration 我们还有一个抽屉(在构造函数中作为参数传递)。

在下面,您将有一个名为 onSupportNavigateUp() 的方法:

override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment)
return navController.navigateUp(appBarConfiguration!!) || super.onSupportNavigateUp()
}

此方法与向上后退按钮有关。但是如果你有抽屉导航,你就不需要太多了。当您在后台堆栈中添加了很多 fragment (或至少两个)时,这真的会派上用场。

Can everything be done with one Activity?

是的,绝对是!但是在条件导航方面仍然需要做更多的工作。就像当你想显示不属于你的抽屉应用程序的 fragment 时。但谷歌仍然在这方面取得了巨大进步。可以引用条件导航here .

How do I handle toolbar visibility with just one Activity and fragments which have a dynamic toolbar visibility. Also, there are fragments which I need to close the drawer and make it inaccessible.

您可以使用 navController 中的 addOnDestinationChangedListener:

navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.loginFragment, R.id.registerFragment, R.id.phoneConfirmationFragment -> {
toolbar?.visibility = View.GONE
drawerLayout?.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
}
else -> {
toolbar?.visibility = View.VISIBLE
drawerLayout?.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
}
}
}

现在您的应用程序上有一个抽屉和导航组件。

关于android - 如何在 Android 中使用 Navigation Drawer 设置 Navigation Component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59304130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com