标签:浸入式状态栏 android support libr toolbar
toolbar是android sdk API21新增的组件,下面是谷歌官方的介绍文档:
A standard toolbar for use within application content.
A Toolbar is a generalization of action
bars for use within application layouts. While an action bar is traditionally part of an Activity‘s opaque
window decor controlled by the framework, a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. An application may choose to designate a Toolbar as the action bar for an Activity using the setActionBar() method.
Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar may contain a combination of the following optional elements:
minimum
height, if set.Toolbar.LayoutParams indicates
a Gravity value
of CENTER_HORIZONTAL the
view will attempt to center within the available space remaining in the Toolbar after all other elements have been measured.action
menu. The menu of actions will pin to the end of the Toolbar offering a few frequent,
important or typical actions along with an optional overflow menu for additional actions. Action buttons are vertically aligned within the Toolbar‘s minimum
height, if set.
In modern Android UIs developers should lean more on a visually distinct color scheme for toolbars than on their application icon. The use of application icon plus title as a standard layout is discouraged on API 21 devices and newer.
上面的介绍的重点是,toolbar是api21 新增的组件,其主要用来弥补actionbar带来的不足,其继承自viewgroup,自由的属性包括导航按钮(类似向上按钮),logo图片,标题和子标题,一个或者多个自定义view,菜单。
其中有一句介绍尤为介绍 An application may choose to designate a Toolbar as the action bar for an Activity using the setActionBar() method.我们可以在任何activity中使用toolbar作为actiobar,但是api21之前只能使用setSupportActionbar(),相应的主题也要设置为NoActionbar(不要怀疑就是这样干,没错儿
),about
toolbar的好,我会娓娓道来(么么哒
)
具体介绍详见sdk/docs/reference/android/widget/Toolbar.html
下面介绍一下AppCompatAcitivity
官方介绍:You can add an ActionBar to
your activity when running on API level 7 or higher by extending this class for your activity and setting the activity theme toTheme.AppCompat or
a similar theme.
其主要用来向低版本的sdk提供添加actionbar的功能,并且提供Theme.AppCompat(就是谷歌推荐的Theme.Material)这样的主题,保证低版本也能获得高版本的效果。
详细介绍见:yourSDKpath/sdk/docs/reference/android/support/v7/app/AppCompatActivity.html
谷歌在新出的22.1 library 还包含了如下的组件,他们最大的特点就是可以在组件之中使用android:theme:来控制组件的样式
AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView
在介绍了如此多的好东西之后,我们开始步入正题,如何使用toolbar 与AppCompatAcitivity实现浸入式Statusbar效果。
首先使用AndroidStudio构建project。
第二步添加依赖库:
选择open module settings》app》dependency,点击下方的加号自行选择 ‘com.android.support:appcompat-v7:22.1.1‘
第三步:修改系统自带主题
将原有的values /style修改为:
<pre name="code" class="html"><resources>
<style name="ActionBarTheme" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<!-- toolbar(actionbar)颜色 -->
<item name="colorPrimary">#673AB7</item>
<!-- 窗口的背景颜色 -->
<item name="colorPrimaryDark">@android:color/holo_blue_bright</item>
</style>
</resources>
Theme.AppCompat.NoActionBar否则会因冲突造成程序crash。
然后我们在相同目录下新建一个folder named:values-v19,此包的作用是提供在api19+以上的效果
我们在其中复制style文件并修改:
<resources>
<style name="ActionBarTheme" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<!-- toolbar(actionbar)颜色 -->
<item name="colorPrimary">#673AB7</item>
<!-- 状态栏颜色 -->
<item name="colorPrimaryDark">@android:color/holo_blue_bright</item>
</style>
</resources>
其中的状态栏颜色只会在api19 以上才会生效。
第四步创建布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_bright"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:minHeight="?attr/actionBarSize">
</android.support.v7.widget.Toolbar><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fitsSystemWindows="true">
<include layout="@layout/toobar"></include>
<android.support.v7.widget.AppCompatCheckedTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, MyActivity"/>
</LinearLayout>第五步:使用AppcompatAcitivity与toolbar
public class MainActivity extends AppCompatActivity {
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this.getWindow().setBackgroundDrawableResource(getResources().getColor(android.R.color.holo_blue_bright));
// 设定状态栏的颜色,当版本大于4.4时起作用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(android.R.color.holo_blue_bright);
}
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitle("主标题");// 标题的文字需在setSupportActionBar之前,不然会无效
setSupportActionBar(mToolbar);
}
}这样的话我们就可以实现了浸入式的效果,在项目中我使用了一个开源的工程SystemBarTintManager,这个资源会在我会贴在源码之中。
然后贴出运行效果:

诸位可能以为我们的追求到此就结束了,
其实还未完成。对于这个toolbar我们还未把玩一番,看到其继承自viewgroup,于是我好奇在其中添加了一个子view,发现竟然能够运行成功
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_bright"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:minHeight="?attr/actionBarSize">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="123"/>
</android.support.v7.widget.Toolbar>标题栏居然显示了123,之前设置title就此失效了,之后我又放入一个新的LinearLayout,也能正确布局,如果有子布局会使得setTitile方法失效,而 mToolbar.setNavigationIcon方法却不受其影响。
如果我们想要模拟actionbar上面的导航按钮类似向上这样的效果,需要在java代码中进行配置mToolbar.setNavigationIcon,xml会因为api版本问题得不到解决。如果不想使用actionbar,我们可以将toolbar注释掉,状态栏的颜色一样是可控的。么么哒,转载请注明出处
源码地址:https://github.com/jelychow/demo
如果有问题欢迎留言或者指正。。。
ToolBar与AppcompatAcitivity实现浸入式Statusbar效果
标签:浸入式状态栏 android support libr toolbar
原文地址:http://blog.csdn.net/jelychow/article/details/45456617