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

Posted

技术标签:

【中文标题】Android:更改导航抽屉应用程序中的当前内容,而不在抽屉菜单中显示项目【英文标题】:Android: change current content in navigation drawer app, without showing item in drawer menu 【发布时间】:2020-11-26 18:33:07 【问题描述】:

我是 android 开发的初学者,我想创建一个带有导航抽屉的应用。我从 Android Studio“创建项目”窗口中的默认模板开始。

这是 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);

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

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

要做的最重要的两件事似乎是:

向活动添加导航目的地/页面。此页面不应包含在导航抽屉的菜单中。应以编程方式打开页面。 页面必须在屏幕顶部有自己的工具栏。

看起来很简单,我尝试了很多,但到目前为止我没有找到任何解决方案。

【问题讨论】:

在图形文件中添加目的地并在片段布局中放置工具栏 @GabrieleMariotti 你能告诉我更多细节吗?我(还)不明白如何实际导航到我添加到图表中的页面。 【参考方案1】:

您可以查看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:

当应用栏的布局对于您应用中的每个目的地都相似时,将顶部应用栏添加到您的 Activity 效果很好。但是,如果您的顶部应用栏在各个目的地之间发生显着变化,请考虑从您的活动中移除顶部应用栏并在每个目的地片段中定义它。

onCreateView 中的FragmentB 中,您可以扩展您的布局

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
       //.....
   

【讨论】:

以上是关于Android:更改导航抽屉应用程序中的当前内容,而不在抽屉菜单中显示项目的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何更改导航抽屉中的片段

如何更改Android中的汉堡包图标(导航抽屉)

导航抽屉和Android中的活动

Android开发之Navigationdrawer导航抽屉功能的实现(源码分享)

如何在 Android 中更改汉堡图标(导航抽屉)

Android中的导航抽屉菜单项标题颜色