Gmail应用,例如使用NavigationDrawer进行片段导航

时间:2018-06-06 06:23:49

标签: android android-fragments android-toolbar

我想像Gmail应用程序一样构建导航。让我澄清一下我的意思。 Gmail应用程序(至少从它的外观)1托管活动,许多片段和导航抽屉。

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

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

enter image description here

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

enter image description here

我试图像这样重现这种行为: 我正在为每个片段单独填充工具栏菜单

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

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

1 个答案:

答案 0 :(得分:1)

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

将此添加到您的家庭活动xml

的xml中

FrameLayout作为容器,它有助于Fragment的事务...并将Framelayout margin top设置为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();

}