Android:更改导航抽屉应用程序中的当前内容,而不显示抽屉菜单中的项目

Android: change current content in navigation drawer app, without showing item in drawer menu

我是 Android 开发的初学者,我想创建一个带有导航抽屉的应用程序。我从 Android Studio 'create project' window.

的默认模板开始

这是来自 MainActivity 的代码,用于设置抽屉导航。

@Override
protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
        R.id.nav_customers, R.id.nav_notes, R.id.nav_stats, R.id.nav_settings)
            .setDrawerLayout(drawer)
            .build();
    navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
}

我有一个片段是 'customers' 页面。该页面包含一个按钮,用户可以单击该按钮来创建新客户。单击该按钮时,应打开一个新页面,该页面接受用于创建客户的输入。 这个新页面不应该是用户可以直接导航到的导航项。打开该页面的唯一方法和原因应该是使用我提到的客户视图中的 'create customer' 按钮。

因此,该新页面不应包含在导航抽屉的菜单中。同时,我也想给这个页面一个自己的工具栏。

最重要的两件事似乎是:

看起来很简单,我也尝试了很多,但至今没有找到任何解决方案。

您可以查看 doc:

在你的图表中定义如下:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          android:label="a"
          tools:layout="@layout/a">
    <action android:id="@+id/action_a_to_b"
            app:destination="@id/b"/>
</fragment>
<fragment android:id="@+id/b"
          android:name="com.example.myapplication.FragmentB"
          android:label="b"
          tools:layout="@layout/b">
</fragment>

然后仅用于导航:

findNavController().navigate(R.id.action_a_to_b)

还要检查这个 page:

Adding the top app bar to your activity works well when the app bar’s layout is similar for each destination in your app. If, however, your top app bar changes substantially across destinations, then consider removing the top app bar from your activity and defining it in each destination fragment, instead.

FragmentBonCreateView 你可以膨胀你的布局

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.fragment_B container, false)

在此布局中,您可以放置​​ Toolbar:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        ... />
    ...
</LinearLayout>

和:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val navController = findNavController()
    val appBarConfiguration = AppBarConfiguration(navController.graph)

    view.findViewById<Toolbar>(R.id.toolbar)
            .setupWithNavController(navController, appBarConfiguration)
}

另一种方法是在 Activity 中设置导航并使用 OnDestinationChangedListener:

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.b) {
       toolbar.visibility = View.GONE
       //....
   } else {
       toolbar.visibility = View.VISIBLE
       //.....
   }