openOptionsMenu function not working in ICS?

后端 未结 8 1962
一整个雨季
一整个雨季 2020-12-03 21:07

Im using action bar compability library. Im trying to open the options menu from a button with openOptionsMenu() function but it does nothing.

Menu shows as usual wh

相关标签:
8条回答
  • 2020-12-03 21:43

    This worked for me, my code is pretty similar to yours, and what I want to do is from a button in the action bar, open the overflow menu:

    public boolean onOptionsItemSelected(MenuItem item) {  
            switch (item.getItemId()) {  
            case R.id.menu_home_about:  
                dialog = new Dialog(this);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.customdialog);
                dialog.show();
                break;
    
                default:
    
            case R.id.menu_home_refresh:
                updateLists(true);
                break;
    
            case R.id.menu_home_menu:
                new Handler().postDelayed(new Runnable() {
                    public void run() {                
                        openOptionsMenu();        
                    }
                }, 0); 
                return true;
    
            }
            return false;  
        }
    
    0 讨论(0)
  • 2020-12-03 21:54

    I was having the same problem trying to go around this openOptionsMenu thing on an app that I was doing that should run on Android 1.6 and up. Following the answer from Werner Van Belle I reached the conclusion that we could achieve a workaround to solve the problem. So I came up with the following code, it's always beatiful when people don't mark a method as final, so we can always override it. It's perfect if you don't want to give up on targeting your app to the latest api (android:targetSdkVersion="17"). I hope you guys like it. :)

    @Override
    public void openOptionsMenu() {
    
        Configuration config = getResources().getConfiguration();
    
        if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) 
                > Configuration.SCREENLAYOUT_SIZE_LARGE) {
    
            int originalScreenLayout = config.screenLayout;
            config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
            super.openOptionsMenu();
            config.screenLayout = originalScreenLayout;
    
        } else {
            super.openOptionsMenu();
        }
    }
    
    0 讨论(0)
  • 2020-12-03 21:54

    If you are using your custom toolbar, you can try:

    toolBar.showOverflowMenu();
    
    0 讨论(0)
  • 2020-12-03 21:57

    android:targetSdkVersion="10" in manifest helped me. openOptionsMenu() works as expected now on ICS+. In addition, there is "overflow" menu button appears at the bottom of screen (on device buttons panel).

    ps: I use NoTitleBar theme (NoActionBar for sdk 11 and higher) +ViewPagerIndicator by Jake Wharton.

    0 讨论(0)
  • 2020-12-03 22:01

    I'm not sure how relevant this is, but this forum post I found seems to be answerring the same question you have.

    I hope this post is relevant enough to solve your problem.

    Good luck!

    0 讨论(0)
  • 2020-12-03 22:01

    I cannot understand the forcing blocking Menu button usage as well. However, the following trick helped me with showing a menu on "restricted" types of devices.

    First of all we need to define, whether we require the following hack or not.

    boolean requireDirtyMenuButtonHack = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) > 0;
    

    Then:

    protected final OnClickListener mMenuButtonClickListener = new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            if (requireDirtyMenuButtonHack) {
                Configuration config = getContext().getResources().getConfiguration();
                config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_XLARGE;
                config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE;
            }
    
            getActivity().openOptionsMenu();
        }
    };
    

    Don't forget to cleanup! (don't know if it's neccessary, but better to play kind)

    public void onPrepareOptionsMenu(Menu menu) {
        if (requireDirtyMenuButtonHack) {
            Configuration config = getContext().getResources().getConfiguration();
            config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_LARGE;
            config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE;
        }
    
        //do the preparing...
    }
    
    0 讨论(0)
提交回复
热议问题