11 菜单设置图片不显示的问题

  • 注意若设置图片不显示那么打破封装性修改源码
    • 案例
      • 代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="1"
        android:showAsAction="never"
        android:title="我设置图片,但没有显示">
        <menu>
            <item
                android:icon="@drawable/ic_launcher"
                android:orderInCategory="1"
                android:showAsAction="never"
                android:title="设置图片的子菜单1"/>
            <item
                android:orderInCategory="2"
                android:showAsAction="never"
                android:title="沒有设置图片的子菜单2"/>
        </menu>
    </item>

</menu>

效果图
设置图片但没有显示的根图
设置了效果图的子按钮

解决办法如下

package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.layout, menu);

        //设置开启图片有效
        setIconEnable(menu,true);

        return super.onCreateOptionsMenu(menu);
    }


    //enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效  
    private void setIconEnable(Menu menu, boolean enable)  
    {  
        try   
        {  
            Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  
            Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);  
            m.setAccessible(true);  

            //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)  
            m.invoke(menu, enable);  

        } catch (Exception e)   
        {  
            e.printStackTrace();  
        }  
    }  

}

posted on 2016-09-05 13:31  木鱼哥  阅读(269)  评论(0编辑  收藏  举报

导航