是否可以在窗口装饰中自动包含工具栏?

时间:2015-10-24 10:02:29

标签: android android-layout android-support-library

我刚刚开始使用支持库23.1迁移到材质主题。 我查阅了指南,所有内容围绕以下程序进行..

1.使用装饰提供的没有ActionBar的主题。即。

<style name="MyTheme" parent="Theme.AppCompat">
...
</style>

2.在活动布局xml中的某处放置工具栏小部件:

<android.support.v7.widget.Toolbar
    android:id=”@+id/myToolbar”
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”?attr/actionBarSize”
    android:background=”?attr/colorPrimary” />

3.在代码中将此工具栏设置为操作栏:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blah);
    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);
}

问题是我的一些活动使用FrameLayout作为根布局,因此工具栏放在屏幕顶部并覆盖现有内容,因此隐藏它。

一种解决方法是创建垂直方向的LinearLayout,并将Toolbar和FrameLayout作为它的子项。但是,这种广告的复杂性,另一层次的观点并影响了性能。

我的第一个问题是setSupportActionBar(工具栏)的机制是如何工作的?是否需要将工具栏放在xml布局中设置的位置,并将其重新插入包含布局的顶部。或者只是把它放在那里?

重点是,是否可以使用新工具栏作为ActionBar提供的装饰?保持我的代码不变,它将自动使用工具栏而不是ActionBar?是否有可能实现这一目标?

编辑 - 更新: 如果我保持我的代码不变,就像我想要保留旧的ActionBar菜单一样没有实例化。

编辑 - 更新

据我所知,没有办法说服android创建工具栏而不是动作栏。这可悲地意味着重构所有活动并添加另一个外部封闭布局,从而不必要地增加复杂性。

2 个答案:

答案 0 :(得分:1)

第一个问题setSupportActionBar(toolbar)如何运作?

上述声明的作用是使toolbar行为像ActionBar。默认情况下,toolbar没有操作栏功能,要使工具栏像操作栏一样,您需要此语句。以下是此方法的官方文档。

  

将工具栏设置为此活动窗口的ActionBar。

     

当设置为非null值时,getActionBar()方法将返回一个   可用于控制给定工具栏的ActionBar对象,如同   这是一个传统的窗户装饰动作吧。工具栏的菜单会   填充活动的选项菜单和导航   按钮将通过标准主菜单选择操作进行连线。

setSupportActionBardecor action bar替换为您提供的toolbar作为活动中的视图。这意味着与操作栏不同,工具栏将作为活动中的视图。它不会将工具栏从布局中取出,并将其重新插入包含布局的顶部。这意味着您可以在屏幕上的任何位置放置toolbar,而不一定在顶部。

第二个问题:保持我的代码不变,它会自动使用工具栏而不是ActionBar吗?

不,你不能这样做。 Toolbar必须存在layout,(通过xml或通过代码充气)。这是工具栏的全部目的。使用操作栏,您没有此控件。工具栏允许您尽可能地修改它,并且您可以在不同的活动中使用不同的工具栏。你是怎么做到的?什么是最佳做法?

嗯,建议所有活动都附带一个片段。所以你可以为所有活动建立一个共同的布局(如下所示)。现在,您可以在FrameLayout

中填充片段
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout 
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

答案 1 :(得分:0)

当然,如果您不想添加工具栏,则必须添加工具栏(但您将丢失工具栏所涉及的一些很酷的导航模式)。

只需让您的活动使用工具栏扩展主题,您就会在那里找到它应该存在的位置。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

然后在您的活动中,您将能够像往常一样获取ActionBar实例:

ActionBar actionBar = getSupportActionBar();