我想在片段上设置我的导航抽屉菜单。我不希望导航抽屉在我启动我的应用程序时出现。我希望它在我进入另一页(即不是第一页)后显示出来。但问题是,onSupportNavigateUp只能写在MainActivity上,也就是第一页
这是我的 MainActivity.kt :
class MainActivity : AppCompatActivity() {
private lateinit var drawerLayout: DrawerLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@Suppress("UNUSED_VARIABLE")
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
drawerLayout = binding.drawerLayout
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this,navController, drawerLayout)
NavigationUI.setupWithNavController(binding.navView, navController)
}
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.myNavHostFragment)
return NavigationUI.navigateUp(navController, drawerLayout)
}
}
这是我的 activity_main.xml `
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/myNavHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:navGraph="@navigation/navigation"
app:defaultNavHost="true"
/>
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/navdrawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>
`
它需要
fragment_title.xml
显示,并通过使用片段标签和NavHostFragment将其用于activity_main.xml
显示。
我还有另一个片段叫做
fragment_home.xml
和HomeFragment.kt
类。
我不知道的是,当我在标题片段上时如何不显示导航抽屉并在我在主页片段上时开始显示导航抽屉?
下面的代码将设置 TitleFragment 中的
navView
可见性并在其他目的地设置可见:
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id == R.id.titleFragment) {
navView.visibility = View.GONE
} else {
navView.visibility = View.VISIBLE
}
}
您可以使用
setDrawerLockMode
功能和 drawerLayout
在某些片段锁定抽屉并在其他片段解锁。
navController.addOnDestinationChangedListener { _, nd, _ ->
if(nd.id == R.id.titleFragment){
// Unlock drawer at title fragment
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
}else{
// Lock drawer closed at other fragments
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
}
}
这里可以修改条件,在某些片段上锁定关闭,在某些片段上无法打开和解锁。