在片段视图中附加额外的工具栏

时间:2016-07-18 11:52:32

标签: java android xml android-toolbar

在仪表板上的应用程序中,有一个应用程序栏,其外观如下图所示。

enter image description here

如图所示,我有一个工具栏,当前显示导航抽屉。

在导航抽屉中,我可以导航到一个片段A,它取代了工具栏下的TAB区域,如下图所示。

enter image description here

有什么方法可以添加这样的两个工具栏,我可以在片段中一起显示导航抽屉图标和后退按钮吗?

2 个答案:

答案 0 :(得分:0)

没有最佳方式来实现您所寻找的目标,因为它与Android Design Guidelines相反。虽然没有明确说明,但导航抽屉图标和后退按钮图标永远不会一起显示。

这种设计背后的理论是导航应该是直观和可预测的,显示两个彼此相邻的导航图标会降低直观的用户界面。如果有返回的内容,则应显示后退按钮。但是,可以通过两种不同的方式解决对持久导航的需求。以Google的Gmail应用为例。

默认情况下,NavigationView支持使用屏幕左边缘的滑动作为打开导航抽屉的手势。在Gmail应用中,当您在任何一个收件箱中时,都会显示导航抽屉图标。选择消息后,导航抽屉图标将替换为后退按钮。但是,您会注意到仍然可以使用之前说明的手势访问抽屉。

Gmail w/ Drawer Icon Gmail w/ Back Button

在较大的屏幕上,Gmail应用程序支持微型导航抽屉。此抽屉可以保持在视图中,而无需显示导航图标。虽然使用当前支持库实现起来有点困难,但如果您希望这样做,this answer可能会有所帮助。

Gmail w/ Persistant Drawer

最后,要回答您的问题,没有内置方法可以同时显示后退按钮和导航抽屉图标。如果你需要这样做,唯一的办法就是使用“解决方法”,就像你现在一样。

尽管如此,我可能做的唯一改变是使用ImageButton而不是ImageView。然后,您可以使用style="?android:attr/actionButtonStyle"设置按钮的样式,以模仿ActionBar按钮的外观。

答案 1 :(得分:-2)

暂时更新以实现上述目标。

我在片段文件中添加了一个布局,我在其中绘制了一个自定义后退按钮:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryDark20"
    android:orientation="horizontal"
    android:padding="15dp"
    android:weightSum="3">
    <ImageView
        android:id="@+id/backButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:layout_weight="0.2"
        android:src="@drawable/delete_icon" />
</LinearLayout>

当一个人点击backImage时,我会调用popBackStack

   imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getFragmentManager().popBackStack();
        }
    });

上面的代码为我提供了所需的功能。

注意,要使上述工作正常,您需要确保将fragmentTransaction添加到backstack,如下所示

final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.home_content_layout,NAME_OFYOUR_FRAGMENT,"nameOfYourFragment");
transaction.addToBackStack(null);
transaction.commit();