binbinyang---Android的Menu同时显示Title的文字和图片,并且动态变化Title的坑(有二个解决办法,亲测)

让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);
}





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值