8

我的应用程序使用旧式选项菜单。目前我们的目标是 API 9。在 Galaxy S4 上,我注意到以下行为:

  1. 用户点击菜单按钮。菜单按预期显示。
  2. 用户点击“更多”以访问溢出部分。溢出部分按预期显示。
  3. 用户点击后退按钮返回原始选项菜单。原始菜单按预期显示。

此时,点击选项菜单中的任何元素(包括“更多”)选项似乎都没有效果。 然而,系统实际上正在缓存这些水龙头。如果用户点击菜单五次(没有可见效果)然后点击后退按钮隐藏菜单,然后点击菜单按钮再次显示菜单,所有缓存的点击都会立即发生。每次用户点击该菜单项时,都会调用一次 onOptionsMenuItemSelected()。

这只发生在 S4(可能还有其他三星设备)上。值得注意的是,我没有看到使用 Galaxy Nexus 运行股票 4.2.2 的这种行为。

这是三星定制 Android 的错误,还是更有可能我在我的应用程序中做错了什么,而股票 Android 代码只是更宽容?

4

1 回答 1

3

下面的自定义菜单代码和运行 jelly bean 4.2.1 的 Galaxy S3 测试并完美运行,

不幸的是,我没有 S4 ,但您也可以检查它,这也没有更多按钮:

 public class CustomMenu extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public boolean onCreateOptionsMenu(android.view.Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.cool_menu, menu);
    getLayoutInflater().setFactory(new Factory() {
        public View onCreateView(String name, Context context,
                AttributeSet attrs) {

            if (name.equalsIgnoreCase(
                    "com.android.internal.view.menu.IconMenuItemView")) {
                try {
                    LayoutInflater li = LayoutInflater.from(context);
                    final View view = li.createView(name, null, attrs);
                    new Handler().post(new Runnable() {
                        public void run() {
                            // set the background drawable if you want that
                            //or keep it default -- either an image, border
                            //gradient, drawable, etc.
                            view.setBackgroundResource(R.drawable.myimage);
                            ((TextView) view).setTextSize(20); 

                            // set the text color
                            Typeface face = Typeface.createFromAsset(
                                    getAssets(),"OldeEnglish.ttf");     
                            ((TextView) view).setTypeface(face);
                            ((TextView) view).setTextColor(Color.RED);
                        }
                    });
                    return view;
                } catch (InflateException e) {
                    //Handle any inflation exception here
                } catch (ClassNotFoundException e) {
                    //Handle any ClassNotFoundException here
                }
            }
            return null;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.AboutUs:
        Intent i = new Intent("com.test.demo.ABOUT");
        startActivity(i);
        break;
    case R.id.preferences:
        Intent p = new Intent("com.test.demo.PREFS");
        startActivity(p);
        break;
    case R.id.exit:
        finish();
        break;
    }
    return false;
  }
 }

不要忘记在 res 文件夹中创建名为 menu 的文件夹,并在 menu 文件夹中为您的菜单创建一个 XML(例如 cool_menu.xml),例如:

  <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
   <item  android:title="about"android:id="@+id/AboutUs" /> 
   <item android:title="Prefs" android:id="@+id/preferences" /> 
   <item android:title="Exit" android:id="@+id/exit" /> 
 </menu>

希望这会有所帮助。

于 2013-06-23T16:10:24.973 回答