带有NavigationDrawer的导航组件

时间:2018-07-19 05:21:00

标签: android android-navigation-drawer android-navigation android-architecture-navigation

我正在尝试在我的项目中使用Navigation Component来实现NavigationDrawer。 我有一个MainActivity作为入口点和多个片段目的地。我已经在我的nav_graph.xml中将“抽屉”菜单项链接到“目标”,一切正常。

我的NavigationDrawer中有一个“注销”菜单项选项,单击该菜单项即启动LoginActivity。我的问题是

  1. 我在我的nav_graph中添加了LoginActivity并将其链接到抽屉中的注销菜单项,这是正确的方法吗?
  2. 一旦启动LoginActivity,当用户按下系统后退按钮时,我希望应用程序进入启动器屏幕,而不是堆栈中的先前目标。导航组件能否实现?

这是我的nav_graph.xml

df['d'] = df['d'].apply(lambda x: list(x) if isinstance(x, tuple) else x)
print (df)

     a   b   c                 d d-separated
0   xx  aa  av               NaN         NaN
1   pp  as  ka      [1, 2, 3, 4]           1
2   pp  as  ka      [1, 2, 3, 4]           2
3   pp  as  ka      [1, 2, 3, 4]           3
4   pp  as  ka      [1, 2, 3, 4]           4
5   pa  aj   q              1234        1234
6   xq  aq  aq               NaN         NaN
7   pn  an  kn  [10, 20, 30, 40]          10
8   pn  an  kn  [10, 20, 30, 40]          20
9   pn  an  kn  [10, 20, 30, 40]          30
10  pn  an  kn  [10, 20, 30, 40]          40
11  px  ax  kx             00012       00012

这是我的drawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/nav_graph"
    app:startDestination="@id/dashboardFragment">

    <fragment
        android:id="@+id/dashboardFragment"
        android:name="com.example.fragment.DashboardFragment"
        android:label="DashboardFragment"
        tools:layout="@layout/fragment_dashboard" />
    <fragment
        android:id="@+id/profileFragment"
        android:name="com.example.fragment.ProfileFragment"
        android:label="ProfileFragment"
        tools:layout="@layout/fragment_profile" />
    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.fragment.SettingsFragment"
        android:label="SettingsFragment"
        tools:layout="@layout/fragment_sale_edit" />
    <activity
        android:id="@+id/loginActivity"
        android:name="com.example.activity.LogoutActivity"
        android:label="LogoutActivity"></activity>
</navigation>

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigationView">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/dashboardFragment"
            android:icon="@drawable/ic_menu_camera"
            android:title="Dashboard" />
        <item
            android:id="@+id/profileFragment"
            android:icon="@drawable/ic_menu_gallery"
            android:title="Profile" />
        <item
            android:id="@+id/settingsFragment"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="Sale Edits" />
        <item
            android:id="@+id/loginActivity"
            android:icon="@drawable/ic_menu_manage"
            android:title="Logout" />
    </group>

</menu>

3 个答案:

答案 0 :(得分:0)

要回答您的问题:

  

我在我的nav_graph中添加了LoginActivity并将其链接到抽屉中的注销菜单项,这是正确的方法吗?

是的,这就是您应该参加一项新活动的午餐时间,但是您想要的与常规活动有所不同。

要实现所需的功能,必须使用loginActivity启动应用程序(使其成为启动器活动),并且该活动将检查用户的会话(具有启动屏幕或加载屏幕),并且如果存在会话,它将会午餐您的主要活动,如果不是用户必须登录,则您可以午餐主要活动。

要使用导航组件执行此操作,您需要为登录活动创建一个新的导航图,并在其中具有主要活动链接。

使用此设置,您应该在新任务中午餐主要活动,然后完成登录活动,这样,重新回到主要活动将关闭应用程序,并从登录活动返回。

如果这个答案不清楚,请告诉我。

答案 1 :(得分:0)

我认为更好的解决方案是使用登录名作为片段而不是活动,并且应该从活动中完成工具栏的处理。 您的活动应如下所示:

Group

答案 2 :(得分:0)

我也一直在努力寻找解决方案,最后这很简单。

!!!从nav_graph.xml和所有处理或连接的代码实例中删除活动导航项。 (例如,我使用AppBarConfiguration,必须从那里删除ID)

只需在您要从导航抽屉中处理的菜单项中使用点击侦听器即可。

navView = findViewById(R.id.nav_view)
val logoutItem = navView.menu.findItem(R.id.loginActivity)
logoutItem.setOnMenuItemClickListener {
    val loginIntent = Intent(this, LoginActivity::class.java)
    startActivity(loginIntent)
    finish()
    return@setOnMenuItemClickListener true
}