本篇文章主要讲解Toolbar常用方法,以实现如下效果为例:
在这列一下需求:
1.Toolbar需要显示左边的返回键,图片是我们自定义的,并且能响应点击事件
2.Toolbar右边显示菜单按钮,图片也是我们自定义的。
3.Toolbar点击右边的菜单按钮可以打开一个popupWindow,popupWindow内容我们的菜单项,菜单项有文字、有图标,菜单项可以响应点击事件
1.首先设置app主题为NoActionBar
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- 修改toolbar图标的颜色-->
<item name="android:textColorSecondary">#ffffff</item>
</style>
2.创建Toolbar
<androidx.appcompat.widget.Toolbar
app:popupTheme="@style/ToolBarPopupThem"
android:gravity="center"
app:navigationIcon="@mipmap/back"
app:titleTextColor="#ffffff"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
>
popupTheme:右侧菜单栏popupWindow的风格
navigationIcon:左侧返回键的图标
titleTextColor:标题颜色
<style name="ToolBarPopupThem" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
<!-- 设置popupMenu背景颜色-->
<item name="android:colorBackground">@color/colorAccent</item>
<!--设置popupMenu弹出位置不覆盖toolbar -->
<item name="overlapAnchor">false</item>
<!-- 修改字体大小 -->
<item name="android:textSize">20sp</item>
<!-- 修改字体颜色 -->
<item name="android:textColor">#fff</item>
</style>
- java代码:
public class MainActivity extends AppCompatActivity {
Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = findViewById(R.id.toolbar);
mToolbar.setTitle("标题");
//设置Toolbar为actionBar
setSupportActionBar(mToolbar);
//设置返回键生效
getSupportActionBar().setHomeButtonEnabled(true);
//替换右侧的菜单图标成我们自定义的图标
mToolbar.setOverflowIcon(getResources().getDrawable(R.mipmap.menu));
}
//Toolbar菜单项和返回键点击回调的方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_home:
Toast.makeText(MainActivity.this, "首页", Toast.LENGTH_SHORT).show();
break;
case R.id.action_me:
Toast.makeText(MainActivity.this, "我的", Toast.LENGTH_SHORT).show();
break;
case R.id.action_focus:
Toast.makeText(MainActivity.this, "关注", Toast.LENGTH_SHORT).show();
break;
default: Toast.makeText(MainActivity.this, "返回键", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
//设置右侧菜单项的内容
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//解析自己写好的menu文件
getMenuInflater().inflate(R.menu.search, menu);
return super.onCreateOptionsMenu(menu);
}
//默认菜单项的图标是不显示的,重写该方法显示
@SuppressLint("RestrictedApi")
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
if (menu != null) {
if (menu.getClass() == MenuBuilder.class) {
try {
//利用反射获取私有方法
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onPrepareOptionsPanel(view, menu);
}
}
4.在res下创建menu文件夹(和layout同级),创建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/action_home"
android:title="首页"
android:icon="@mipmap/home"
app:showAsAction="collapseActionView"/>
<item
android:id="@+id/action_me"
android:title="我的"
android:icon="@mipmap/me"
app:showAsAction="collapseActionView"/>
<item
android:id="@+id/action_focus"
android:title="关注"
android:icon="@mipmap/focus"
app:showAsAction="collapseActionView"/>
</menu>