android Toolbar的使用
参考文章
ToolBar详解(手把手教程)
stackoverflow-Android toolbar menu is not showing
actionBar和Toolbar中如何动态隐藏和修改menu上的菜单
效果图
配置material design
请确保有依赖以下三项1
2
3compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.android.support:support-v4:25.1.1'
compile 'com.android.support:design:25.1.1'
去除原有的actionBar
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> |
toolbar代码
res\layout\toolbar.xml1
2
3
4
5
6
7
8
9
10
11
12
13<?xml version="1.0" encoding="utf-8"?>
<!--colorPrimary是主题使用的颜色,可以value/color.xml中修改-->
<!--actionBarSize是系统actionBar的高度-->
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:menu="@menu/menu_toolbar"
>
</android.support.v7.widget.Toolbar>
一般来说toolbar会应用多个activity,所以我单独作为一个xml来使用,
在activity.xml中只需使用include标签,方便使用
1 | <include |
编写menu/menu_toolbar.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
java注意setSupportActionBar和onPrepareOptionsMenu
src\MainActivity.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView hello= (TextView) findViewById(R.id.hello);
Toolbar toolbar= (Toolbar) findViewById(R.id.toolbar);
//配置代替actionBar
setSupportActionBar(toolbar);
//设置图标
toolbar.setLogo(getResources().getDrawable(R.mipmap.ic_launcher));
toolbar.setNavigationIcon(R.mipmap.ic_launcher);
toolbar.setTitle("setTitle主标题");
toolbar.setSubtitle("setSubtitle副标题");
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.search:
hello.setText("您点击了搜索");
break;
case R.id.write:
hello.setText("您点击了书写");
break;
case R.id.book:
hello.setText("您点击了书籍");
break;
}
return false;
}
});
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_toolbar,menu);
return super.onPrepareOptionsMenu(menu);
}
遇见的问题
menu没有展示
出现我第一时间考虑,没有使用menu属性配置。
很显然我是有的
1 | <android.support.v7.widget.Toolbar |
stackoverflow-Android toolbar menu is not showing
我在参考了stackoverflow的问题,之后发现是我没有使用
onPrepareOptionsMenu()
1 | @Override |
后来,我尝试保留onPrepareOptionsMenu(),把setSupportActionBar()去掉,发现menu同样也会消失不见。
我由此估计,menu是actionbar才有的功能,toolbar只是调用了actionbar功能的部分方法。
所以,才有先用setSupportActionBar()替换actionbar
再onPrepareOptionsMenu();创建menu
onPrepareOptionsMenu与onCreateOptionsMenu与onOptionsItemSelected的关系
onCreateOptionsMenu():创建菜单,但是从初始开始就只运行一次,所以activity实例化后,无法修改菜单内容
onOptionsItemSelected():对选中的菜单进行操作
onPrepareOptionsMenu():创建菜单,activity初始化后仍会调用此方法,所以可在方法编写activity初始化后的功能