您的位置:首页 > 移动开发 > Android开发

Android Toolbar 使用总结

2017-05-14 17:14 253 查看
Toolbar 是在 Android5.0 推出的一款 MD 风格的导航控件,主要是为了替换 Actionbar 的。与 Actionbar 相比,Toolbar 非常灵活,我们可以自由地在 Toolbar 内添加子控件。

使用 Toolbar

由于 Toolbar 是在 Android5.0 才开始加上的,低版本要使用的话,需要引入 support-v7 兼容包,使用 android.support.v7.widget.Toolbar 进行开发。

compile 'com.android.support:appcompat-v7:25.3.1'


修改 style

打开 res/values/styles.xml,默认配置如下:

<!-- Base application theme. -->
<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>


来看一下 style 属性所对应的涵义



隐藏默认的 Toolbar

方式1

改成其他没有 Toolbar 的主题

parent="Theme.AppCompat.Light.NoActionBar"


方式2

自己建立一个主题,并在属性中设置无 Toolbar

<style name="AppTheme" parent="AppTheme.Base">
</style>

<style name="AppTheme.Base" parent="AppTheme">
<!--将ActionBar隐藏,这里使用ToolBar-->
<item name="windowActionBar">false</item>
<!-- 使用 API Level 22以上编译的话,要拿掉前綴字 -->
<item name="windowNoTitle">true</item>
<!--colorPrimaryDark对应状态栏的颜色-->
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<!--colorPrimary 对应ToolBar的颜色-->
<item name="colorPrimary">@color/colorPrimary</item>
<!--colorAccent 对应EditText编辑时、RadioButton选中、CheckBox等选中时的颜色。-->
<item name="colorAccent">@color/colorAccent</item>
<!--窗口的颜色-->
<item name="android:windowBackground">@color/colorWindow</item>
</style>


如果不隐藏默认 Toolbar,在代码中对 Toolbar 进行 setSupportActionBar 操作时,会报错:

Caused by: jav
c842
a.lang.IllegalStateException: This Activity already has an action bar
supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set
windowActionBar to false in your theme to use a Toolbar instead.


在布局文件中添加 Toolbar 控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ginkwang.toolbarsample.MainActivity">

<android.support.v7.widget.Toolbar
android:id="@+id/tb_main"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"/>
</RelativeLayout>


?attr/actionBarSize : 表示根据屏幕的分辨率采用系统默认的高度 如果低版本也要使用的话,则需要使用v7包的,否则只有api21上才能有效

Java 文件中调用

Toolbar 的一些属常用属性也在代码中使用并写明作用了。

public class MainActivity extends AppCompatActivity {

private Toolbar mTbMain;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {
mTbMain = (Toolbar) findViewById(R.id.tb_main);
//设置 APP logo
mTbMain.setLogo(R.mipmap.ic_logo);
//设置主标题,默认为 app_label
mTbMain.setTitle("标题");
//设置主标题文字颜色
mTbMain.setTitleTextColor(getResources().getColor(R.color.colorWhiteOne));
//设置副标题
mTbMain.setSubtitle("副标题");
//设置副标题颜色
mTbMain.setSubtitleTextColor(getResources().getColor(R.color.colorWhiteTwo));
//设置侧边栏(抽屉)的按钮
mTbMain.setNavigationIcon(R.mipmap.ic_navigation);
//取代原本的 Actionbar
setSupportActionBar(mTbMain);
}
}




Toolbar 的高级用法

NavigationIcon 点击事件

设置 NavigationIcon 的点击事件,需要放在 setSupportActionBar 之后设置才会生效,因为setSupportActionBar 里面也会 setNavigationOnClickListener()

setSupportActionBar(mTbMain);
//设置NavigationIcon的点击事件,需要放在setSupportActionBar之后设置才会生效,
//因为setSupportActionBar里面也会setNavigationOnClickListener
mTbMain.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View pView) {
// TODO: 2017/5/5 添加抽屉
}
});


添加菜单 Menu

菜单布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/menu_item_share"
android:icon="@mipmap/ic_share"
android:orderInCategory="1"
android:title="@string/menu_share"
app:showAsAction="always"/>

<item
android:id="@+id/menu_item_about"
android:icon="@mipmap/ic_about"
android:orderInCategory="2"
android:title="@string/menu_about"
app:showAsAction="ifRoom"/>

<item
android:id="@+id/menu_item_more"
android:icon="@mipmap/ic_more"
android:orderInCategory="3"
android:title="@string/menu_more"
app:showAsAction="never"/>
</menu>


其中,

android:orderInCategory 属性代表 actionbar 里每个item的优先级,值越大优先级越低

app:showAsAction 属性表示是否在 ToolBar 上显示按钮,属性值有如下几种:

always:使菜单项一直显示在ToolBar上

ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上

never:使菜单项永远都不出现在ToolBar上,在…的子项中显示

withText:使菜单项和它的图标,菜单文本一起显示

由于showAsAction属性是在支持包中定义的,所以需要添加命名空间:

xmlns:app="http://schemas.android.com/apk/res-auto"


Java 代码中添加 Menu 监听

方法一

重写onCreateOptionsMenu(Menu menu)、onOptionsItemSelected(MenuItem item)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_share:
Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_LONG).show();
break;

case R.id.menu_item_about:
Toast.makeText(MainActivity.this, "关于", Toast.LENGTH_LONG).show();
break;

case R.id.menu_item_more:
Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show();
break;
}
return true;
}


方法二

重写onCreateOptionsMenu(Menu menu),通过toolbar.setOnMenuItemClickListener()监听

mTbMain.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_share:
Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_LONG).show();
break;

case R.id.menu_item_about:
Toast.makeText(MainActivity.this, "关于", Toast.LENGTH_LONG).show();
break;

case R.id.menu_item_more:
Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show();
break;
}
return true;
}
});


跟 NavigationIcon 监听事件一样,都是要设置在 setSupportActionBar 之后才会生效。

效果图:





参考

Android开发:最详细的 Toolbar 开发实践总结

ToolBar的使用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: