最近项目需要使用toolbar,在使用过程中遇到2个问题,现将解决办法记录下来,以备查阅。
- title无法居中;
- 添加menu不显示图片;
1、title无法居中。toolbar是继承viewgroup,把toolbar当成容器,添加一个textview
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:minHeight="?attr/actionBarSize"
app:maxButtonHeight="40dp"
app:navigationIcon="@mipmap/back"
app:title="">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/setting"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="bold"></TextView>
</android.support.v7.widget.Toolbar>
结果如下:
2、添加menu不显示图片,要使用actionbar的menu菜单,需按如下步骤:
- 编写menu文件menu_order.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_share"
android:icon="@mipmap/search"
android:orderInCategory="0"
android:title="@string/search"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_news"
android:icon="@mipmap/news_menu"
android:orderInCategory="1"
android:title="@string/news"
app:showAsAction="never" />
<item
android:id="@+id/action_home"
android:icon="@mipmap/home_menu"
android:orderInCategory="2"
android:title="@string/home"
app:showAsAction="never" />
</menu>
2、复写onCreateOptionsMenu方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// setIconEnable(menu,true);
getMenuInflater().inflate(R.menu.menu_order, menu);
return true;
}
3、设置toolbar支持actionbar属性,以及menu点击事件
setSupportActionBar(toolBar);
// toolBar.setRightButtonVisible(View.GONE);
// toolBar.setTitlePaddingLeft(20);
toolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.action_search:
// toolBar.showSearchView();
break;
case R.id.action_news:
break;
}
return false;
}
});
4、复写onPrepareOptionsPanel,通过反射机制,让menu现实icon(图标)
@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) {
Log.i(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu" + e);
}
}
}
return super.onPrepareOptionsPanel(view, menu);
}
结果如下:
注:在toolbar中添加了textview代替原有title,并设置setSupportActionBar(toolBar);则需在之前设置title为空
toolBar.setTitle("");
setSupportActionBar(toolBar);
如需设置menu字体,则如下:
<style name="MenuTextStyle">
<item name="android:textColor">@color/grey</item>
<item name="android:textSize">13sp</item>
</style>
<style name="AppThemeWhite" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryDark">@color/white</item>
<item name="android:textColorPrimary">@color/heise</item>
<!-- 窗口的背景颜色 -->
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item <!-- menu字体样式 -->
name="android:actionMenuTextAppearance">@style/MenuTextStyle</item>
</style>