我刚刚开始使用支持库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创建工具栏而不是动作栏。这可悲地意味着重构所有活动并添加另一个外部封闭布局,从而不必要地增加复杂性。
答案 0 :(得分:1)
第一个问题:setSupportActionBar(toolbar)
如何运作?
上述声明的作用是使toolbar
行为像ActionBar
。默认情况下,toolbar
没有操作栏功能,要使工具栏像操作栏一样,您需要此语句。以下是此方法的官方文档。
将工具栏设置为此活动窗口的ActionBar。
当设置为非null值时,getActionBar()方法将返回一个 可用于控制给定工具栏的ActionBar对象,如同 这是一个传统的窗户装饰动作吧。工具栏的菜单会 填充活动的选项菜单和导航 按钮将通过标准主菜单选择操作进行连线。
setSupportActionBar
将decor 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();