首页 新闻 会员 周边

android 4.2 的模拟器不能显示底部带图标菜单但在 android2.3.3 的模拟器上就可以

0
悬赏园豆:5 [已关闭问题] 关闭于 2013-01-14 17:37

最近初学android看到在资源文件中配置菜单项于是自己试了一下。

xml文件如下

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:icon="@drawable/menu_findkey"
        android:title="@string/menu_file">
        <menu>
            <group android:id="@+id/menu_group_file" >
                <item
                    android:id="@+id/menu_new"
                    android:title="@string/menu_file_new"/>
                <item
                    android:id="@+id/menu_open"
                    android:title="@string/menu_file_open"/>
            </group>
        </menu>
    </item>
    <item
        android:id="@+id/menu_settings"
        android:icon="@drawable/menu_setting"
        android:title="@string/menu_settings"/>
    <item
        android:id="@+id/menu_exit"
        android:icon="@drawable/menu_exit"
        android:title="@string/menu_exit"/>

</menu>

主界面activity如下:

 1 import android.app.Activity;
 2 import android.app.AlertDialog;
 3 import android.content.DialogInterface;
 4 import android.content.DialogInterface.OnClickListener;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.view.MenuItem;
 8 import android.view.Window;
 9 import android.widget.Toast;
10 
11 public class Demo_MainActivity extends Activity {
12 
13     private AlertDialog.Builder builder;
14 
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         requestWindowFeature(Window.FEATURE_NO_TITLE);
19         setContentView(R.layout.activity_demo__main);
20         builder = new AlertDialog.Builder(this);
21     }
22 
23     @Override
24     public boolean onCreateOptionsMenu(Menu menu) {
25         // Inflate the menu; this adds items to the action bar if it is present.
26         getMenuInflater().inflate(R.menu.activity_demo__main, menu);
27         return true;
28     }
29 
30     @Override
31     public boolean onOptionsItemSelected(MenuItem item) {
32         // TODO Auto-generated method stub
33         switch (item.getItemId()) {
34         case R.id.menu_new:
35             Toast.makeText(this, "新建菜单被点击", Toast.LENGTH_SHORT).show();
36             break;
37         case R.id.menu_open:
38             Toast.makeText(this, "打开菜单被点击", Toast.LENGTH_SHORT).show();
39             break;
40         case R.id.menu_settings:
41             Toast.makeText(this, "设置菜单被点击", Toast.LENGTH_SHORT).show();
42             break;
43         case R.id.menu_exit:
44             builder.setTitle("提醒")
45                     .setPositiveButton("确定", new OnClickListener() {
46 
47                         public void onClick(DialogInterface dialog, int which) {
48                             // TODO Auto-generated method stub
49                             dialog.dismiss();
50                             Demo_MainActivity.this.finish();
51 
52                         }
53                     }).setNegativeButton("取消", new OnClickListener() {
54 
55                         @Override
56                         public void onClick(DialogInterface dialog, int which) {
57                             // TODO Auto-generated method stub
58                             dialog.dismiss();
59                         }
60                     });
61             builder.create().show();
62             break;
63 
64         }
65         return super.onOptionsItemSelected(item);
66     }
67 }

不知到底是程序有问题还是模拟器有问题呢?求解答。

sfguter的主页 sfguter | 菜鸟二级 | 园豆:202
提问于:2013-01-07 15:24
< >
分享
所有回答(1)
0

转载:解决android4.0系统中菜单(Menu)添加Icon无效问题

http://blog.csdn.net/stevenhu_223/article/details/9705173

 

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的。这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源码如下:

public class MenuBuilder implements Menu {
//...
private boolean mOptionalIconsVisible = false;
//....
    void setOptionalIconsVisible(boolean visible) {
        mOptionalIconsVisible = visible;
    }

    boolean getOptionalIconsVisible() {
        return mOptionalIconsVisible;
    }
//...
}

上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象的(MenuBuilder为系统内部的框架类);

   这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了;

  代码实现如下:

 1 package com.stevenhu.mie;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 import android.app.Activity;
 6 import android.os.Bundle;
 7 import android.util.Log;
 8 import android.view.Menu;
 9 import android.view.MenuItem;
10 
11 public class MainActivity extends Activity 
12 {
13     /** Called when the activity is first created. */
14     @Override
15     public void onCreate(Bundle savedInstanceState)
16     {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.main);
19     }
20 
21     @Override
22     public boolean onCreateOptionsMenu(Menu menu)
23     {
24         //运行时,参数Menu其实就是MenuBuilder对象
25         Log.d("MainActivity", "menu--->" + menu);
26         
27         /*利用反射机制调用MenuBuilder的setOptionalIconsVisible方法设置mOptionalIconsVisible为true,
28          * 给菜单设置图标时才可见
29          */
30         setIconEnable(menu, true);
31         
32         MenuItem item1 = menu.add(0, 1, 0, R.string.item1);
33         item1.setIcon(R.drawable.camera);
34         
35         MenuItem item2 = menu.add(0, 1, 0, R.string.item2);
36         item2.setIcon(R.drawable.dial);
37         
38         MenuItem item3 = menu.add(0, 1, 0, R.string.item3);
39         item3.setIcon(R.drawable.sms);
40         
41         return super.onCreateOptionsMenu(menu);
42     }
43 
44     @Override
45     public boolean onPrepareOptionsMenu(Menu menu) 
46     {
47         // TODO Auto-generated method stub
48         return super.onPrepareOptionsMenu(menu);
49     }
50     
51     //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
52     private void setIconEnable(Menu menu, boolean enable)
53     {
54         try 
55         {
56             Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
57             Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
58             m.setAccessible(true);
59             
60             //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
61             m.invoke(menu, enable);
62             
63         } catch (Exception e) 
64         {
65             e.printStackTrace();
66         }
67     }
68 }

通过上面的代码,就可以实现在Android4.0系统中设置菜单的Icon有效了;

   Demo下载链接地址:http://download.csdn.net/detail/stevenhu_223/5854207

仲夏叶 | 园豆:202 (菜鸟二级) | 2013-11-07 21:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册