借鉴了以下两篇博文
Toolbarhttps://www.jianshu.com/p/b3a40a55826e
https://blog.csdn.net/da_caoyuan/article/details/79557704
Toolbar与ActionBarAndroid 向 AndroidX的迁移Toolbar的基本用法
准备工作常用的方法
xml中的设置解释xml中参数的意义如果不在xml中设置,在java中设置设置标题的字体大小 自定义View结合menu菜单与AppBarLayout结合的使用
Toolbar与ActionBar在看本篇博文之前,建议写阅读下有关ActionBar的文章,可以加深对Toolbar的理解,如博主的这篇博文Toolbar。从Android3.0(API level 11)开始,所有使用默认主题的activity都自带一个ActionBar,但是随着Android版本的迭代,ActionBar的特性不断增加,从而导致了在不同Android系统的设备上,ActionBar的显示不一致。从Android5.0(API level 21)开始,引进了Toolbar,它包含了ActionBar最近添加的大多数特性(这也是我为什么建议先了解ActionBar的原因),同时添加到了支持库中,使得在低版本设备上也可以使用Toolbar。Toolbar与ActionBar的区别:
ToolBar就是一个View,跟其他View一样包含在布局中。像常规View一样,Toolbar很容易来放置、实现动画以及控制效果。一个Activity中可以有多个Toolbar。 Android 向 AndroidX的迁移
背景知识:Google 2018 IO 大会推出了 Android新的扩展库 AndroidX,用于替换原来的 Android扩展库,将原来的 android.* 替换成 androidx.* ;只有包名和Maven工件名受到影响,原来的类名、方法名和字段名不会更改。而Toolbar也由原来的android.support.v7.widget.Toolbar支持库,迁移到
androidx.appcompat.widget.Toolbar支持库。为保证项目中版本的一致,出现的各种类库都要使用androidx库。
Toolbar的基本用法
准备工作
在应用的build.gradle中添加androidx支持库
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
...
}
让Activity继承自AppCompatActivity
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
}
在AndroidManifest.xml文件中,设置标签中使用appcompat中的某个NoActionBar主题,从而去除使用ActionBar来提供操作栏。
在activity的布局中添加Toolbar
在activity中的onCreate()方法中,调用setSupportActionBar() 方法,传入Toolbar,这样就会将Toolbar设置为activity的操作栏了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 将ToolBar设置成activity的操作栏
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
}
常用的方法
xml中的设置
解释xml中参数的意义
效果图
如果不在xml中设置,在java中设置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 将ToolBar设置成activity的操作栏
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// 显示应用的Logo
getSupportActionBar().setLogo(R.mipmap.launcher);
// 显示导航按钮
toolbar.setNavigationIcon(R.drawable.back);
// 显示标题和子标题及相关颜色
// 博客里提供的,测试你下不用写上也能实现
//getSupportActionBar().setDisplayShowTitleEnabled(true);
toolbar.setTitle("TitleJava");
toolbar.setTitleTextColor(Color.BLUE);
toolbar.setSubtitle("SubtitleJava");
toolbar.setSubtitleTextColor(Color.GREEN);
// 导航按钮(左边返回按钮)的监听事件
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
此时xml文件中的属性设置为:
导航按钮的监听事件除了上面的写法,还可以在 onOptionsItemSelected() 方法中设置,如下所示:
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:// 导航按钮,即左边返回按钮
finish();
break;
default:
break;
}
}
- 但是这部分要结合menu知识点,只写上面这部分并不会有反应。下面介绍menu资源的时候会再次提到此处。
注意1:你如果添加了setSupportActionBar(toolbar),那么toolbar.setNavigationOnClickListener监听方法,要放到其后面,否则点击事件,监听不到的。 设置标题的字体大小
看上面的属性,没有设置标题字体大小的属性因此通过标题样式进行更改首先定义一个style:
然后通过app:titleTextAppearance 属性进行调用。如下所示:
这里是既能修改标题(子标题)字体大小,也能修改字体颜色如果在前面java代码中增加修改字体颜色的代码,最终呈现的是java代码中的效果。 自定义View
这里,如果想要标题居中怎么办呢?查看Toolbar并没有居中的办法,也就是提供了使其距左右,上下边距大小的方法。因此引入自定义View因为Toolbar是ViewGroup的子类,因此可以向其内部添加View进行显示。这里我们添加一个TextView,显示一个居中的文本。
注意:此时TextView的控件的宽和高都是自适应大小,java中此行代码setSupportActionBar(toolbar)就不要添加了,否则就会显示不正常了。如果你非要添加setSupportActionBar(toolbar)这行代码的话,TextView控件的宽要用match_parent属性。这里再次建议不要添加这行代码。(但其实自己测试的时候,添加这句代码,并没有显示不正常,不过仍然记录下来,以防不测。)上面是引用的博客里提到的,按要求删掉setSupportActionBar(toolbar)这行代码,发现getSupportActionBar().setLogo(R.mipmap.launcher)代码出错了,出错信息是java.lang.NullPointerException即getSupportActionBar()方法找不到ActionBar那么这里就要理解setSupportActionBar(toolbar)这句代码的作用:
在Toolbar这个控件出现之前,其实我们可以通过ActionBar actionBar = getSupportActionBar()方法获取到ActionBar。(前提是你的主题theme,是采用的带ActionBar的主题,如果你采用的是主题是NoActionBar,则拿到的ActionBar是null。)之后你就可以采用如下方法来操作ActionBar了:
ActionBar actionbar = getSupportActionBar();
if(actionbar != null){
actionbar .setDisplayShowHomeEnabled(true);
actionbar .setDisplayUseLogoEnabled(true);*/
actionbar .setTitle("主标题");
}else{
Log.d("fhy","onCreate: ActionBar is null!");
}
但是,原生自带的ActionBar设置的灵活性,还是有限,因此Toolbar这个控件,也就应运而生了!此时,如果使用Toolbar代替了ActionBar,但是自己还是想用ActionBar的一些特性怎么办呢?这个时候setSupportActionBar(toolbar)就发挥其作用了,添加这行代码,你的toolbar可以说也就是具有了ActionBar的相关属性了。因此也可以理解,为什么删除了setSupportActionBar(toolbar)这句代码,getSupportActionBar().setLogo(R.mipmap.launcher)代码就出错了。建议: 如果用不到ActionBar的一些特性的话,建议setSupportActionBar(toolbar)这句代码就不要添加了。但是这里因为添加Logo需要ActionBar特性,这里还是加上了。 结合menu菜单
首先在res/menu目录下新建一个main.xml文件,添加几个Action,如下所示:
menu文件中的设置这里就不再介绍了,ActionBar博文中讲得很清楚了。activity活动中加载menu菜单
// 加载菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
给每个Action添加点击事件,包括上文提到的导航按钮(android.R.id.home):
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:// 导航按钮,即左边返回按钮
finish();
break;
case R.id.user:
Toast.makeText(this,"You clicked 用户",Toast.LENGTH_SHORT).show();
break;
case R.id.write:
Toast.makeText(this,"You clicked 发布",Toast.LENGTH_SHORT).show();
break;
case R.id.favo:
Toast.makeText(this,"You clicked 收藏",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
注意到点击overflow按钮(溢出列表)时,弹出的菜单位置太靠上了,可以设置吗?还有菜单的背景和文字颜色也可以设置。
首先设置好样式
直接引用app:popupTheme="@style/ToolbarPopupTheme"
效果图
与AppBarLayout结合的使用
博主自己对AppBarLayout还不了解,这部分挖个坑,留着以后再来填补。



