首页 > 解决方案 > Gmail 应用,例如带有 NavigationDrawer 的片段导航

问题描述

我想以与 Gmail 应用程序完全相同的方式构建导航。让我澄清一下我的意思。Gmail 应用程序(至少从外观上看)有 1 个托管活动、许多片段和导航抽屉。

我想要的是工具栏的行为与 Gmail 应用程序中的相同。

当在列表片段(收件箱,重要等)中时,有这个工具栏:您可以看到导航抽屉在那里切换并且它按预期工作。

在此处输入图像描述

当导航到单个项目片段时,会出现此工具栏: 请注意,后退按钮的行为类似于后退按钮应有的行为(导航到上一个视图)。并且导航抽屉仍然可以通过从侧面滑动来使用。

在此处输入图像描述

我正在尝试像这样重现这种行为:我正在为每个片段单独膨胀工具栏菜单

// both inside list and item fragments
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)
}

// inside list fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
    menuInflater.inflate(R.menu.list_toolbar, menu)
    super.onCreateOptionsMenu(menu, menuInflater)
}

// inside item fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
    menuInflater.inflate(R.menu.item_toolbar, menu)
    super.onCreateOptionsMenu(menu, menuInflater)
}

现在因为需要从所有片段中使用导航抽屉。它需要放置在托管活动视图中(我认为)。这就是我初始化它的方式

override fun onCreate(savedInstanceState: Bundle?) {
    // inside hosting activity view
    ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close).apply { 
        addDrawerListener(this)
        syncState()
    }
}

这行得通,我得到了工作导航抽屉。但是,当我导航到项目片段时。工具栏中的后退按钮充当导航抽屉切换按钮,显示和隐藏抽屉,而不是向后导航。

PS。这就是我在项目片段 onCreate 方法中添加后退按钮的方式

(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
(activity as AppCompatActivity).supportActionBar?.setDisplayShowHomeEnabled(true)

所以实际的问题是如何让后退按钮表现得像它应该的那样,而不是切换导航抽屉?

标签: androidandroid-fragmentsandroid-toolbar

解决方案


创建名为 homeActivity 的活动作为(示例)

将此添加到您的 xml 中,这是您的 homeactivity xml

FrameLayout 作为容器,它有助于处理 Fragment ...并将 Framelayout 边距设置为 50dp,以便在您开始交易时工具栏将保留在那里

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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"
>


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="53dp"
    android:layout_alignParentTop="true"
    android:id="@+id/too"
    >
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        >
        <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:id="@+id/tabs"
            android:background="@drawable/new_layout"
            >
            <ImageView(icon)
                android:id="@+id/animation_view"
                android:layout_marginTop="5dp"
                android:layout_width="40dp"
                android:layout_height="40dp"
                />

        </android.support.v7.widget.Toolbar>

 </android.support.design.widget.AppBarLayout>
</RelativeLayout>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop = "50dp"
    android:id="@+id/container">
  </FrameLayout>

 </android.support.design.widget.CoordinatorLayout>

在家庭活动中使用它进行交易

private void initializeFragment(){

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

    fragmentTransaction.add(R.id.main_container, homeFragment);
    fragmentTransaction.add(R.id.main_container, notificationFragment);
    fragmentTransaction.add(R.id.main_container, accountFragment);

    fragmentTransaction.hide(notificationFragment);
    fragmentTransaction.hide(accountFragment);

    fragmentTransaction.commit();

}

private void replaceFragment(Fragment fragment, Fragment currentFragment){

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    if(fragment == homeFragment){

        fragmentTransaction.hide(accountFragment);
        fragmentTransaction.hide(notificationFragment);

    }

    if(fragment == accountFragment){

        fragmentTransaction.hide(homeFragment);
        fragmentTransaction.hide(notificationFragment);

    }

    if(fragment == notificationFragment){

        fragmentTransaction.hide(homeFragment);
        fragmentTransaction.hide(accountFragment);

    }
    fragmentTransaction.show(fragment);

    //fragmentTransaction.replace(R.id.main_container, fragment);
    fragmentTransaction.commit();

}

推荐阅读