让Menu同时显示图标和文字,并动态改变menu的title
今天在开发中,遇到了一个蛋疼的问题,
开始以为是自己代码有错,debug看了后发现不是地图获取当前定位的问题
接下来,老规矩直接上图
右上角是一个menu的title+icon ,但是写完只有 icon是出来了 可是title死活出不来
解决办法:
方法一:
在menu.xml文件中配置了图标和文字,但是在有图标的情况下文字是不会显示的,即使设置 app:showAsAction="always|withText" 但是我在运行的时候发现并没有显示文字,处理方法是通过另外一个属性实现app:actionLayout.
首先menu.xml定义如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/city"
android:title=""
android:orderInCategory="100"
app:showAsAction="always|withText"
app:actionLayout="@layout/layout_icon_city"
/>
</menu>
app:actionLayout指向了一个布局,可以在这个布局中定义你想要的控件。我的定义是这样的。
layout_icon_city
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_city_add_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center"
android:text=" "
android:drawableRight="@mipmap/ic_select_city"
android:textColor="#000000"
android:clickable="true" />
android:drawableLeft中指定你的图标。
然后还要在onCreateOptionsMenu中重写一下Menu的点
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_select_city, menu);
final MenuItem item = menu.findItem(R.id.city);
TextView mCityName = (TextView) item.getActionView().findViewById(R.id.tv_city_add_icon);
mCityName.setText(mCity);
item.getActionView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onOptionsItemSelected(item);
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.city:
Actions.startSelectCityActivity(getActivity());
break;
}
return super.onOptionsItemSelected(item);
}
其中如果你先变化title的内容
inflater.inflate(R.menu.menu_select_city, menu);
final MenuItem item = me:nu.findItem(R.id.city);
TextView mCityName = (TextView) item.getActionView().findViewById(R.id.tv_city_add_icon);
mCityName.setText(mCity);
Activity中的menu条目,在设置其showAsAction="never"时,默认只显示文字title,而不会显示图标icon,可以在Activity中重写onMenuOpened(),通过反射使其图标可见。
// 让菜单同时显示图标和文字
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onMenuOpened(featureId, menu);
}