Подтвердить что ты не робот

Функция openOptionsMenu не работает в ICS?

Im использует библиотеку совместимости панели действий. Я пытаюсь открыть меню опций с помощью кнопки с функцией openOptionsMenu(), но ничего не делает.

Меню отображается как обычно при нажатии клавиши меню на моем телефоне. Что здесь не так?

public class ReadActivity extends ActionBarActivity {

    ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean value;
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.read, menu);
        value = super.onCreateOptionsMenu(menu);

        if (Helper.SupportsNewApi()) {
            getActionBar().hide();
        } else {
            ((View) ((LinearLayout) findViewById(R.id.actionbar_compat))
                    .getParent()).setVisibility(View.GONE);
        }

        return value;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            break;
        case R.id.menu_search:
            // Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show();
            break;
        case R.id.menu_bookmark:
            // selectText();
            // setFullScreen(false);
            break;
        case R.id.menu_day_night_mode:
            break;
        case R.id.menu_settings:
            break;
        case R.id.menu_zoom_in:
            showOverlay(false);
            break;
        case R.id.menu_zoom_out:
            showOverlay(false);
            break;
        case R.id.menu_table_of_contents:
            Intent tocIntent = new Intent(this, TocActivity.class);
            int GET_SECTION_REFERENCE = 1;
            startActivityForResult(tocIntent, GET_SECTION_REFERENCE);
            break;
        case R.id.menu_overflow:
            Toast.makeText(this, "Tapped overflow", Toast.LENGTH_SHORT).show();

            //closeOptionsMenu();
            openOptionsMenu(); //tried the below aswell, no results
            //getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, null);
            break;
        }
        return super.onOptionsItemSelected(item);
    }


    @Override //disable volume buttons
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (!menuShown && (keyCode == 25 || keyCode == 24)) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d(tag, "Keycode is = "+keyCode);
        if (keyCode == 82) {
            if (!menuShown) {
                //openOptionsMenu();
                showOverlay(true);
            } else {
                showOverlay(false);
            }


                    //don't want it to open when pressing menu
            return true;
        } else if (keyCode == 4 && menuShown) {
            showOverlay(false);
            return true;
        } else if (keyCode == 25 && !menuShown) {
            prevPage();
            return true;
        } else if (keyCode == 24 && !menuShown) {
            nextPage();
            return true;
        }

        return super.onKeyUp(keyCode, event);
    }

}
4b9b3361

Ответ 1

Я не уверен, насколько это уместно, но этот форум, который я нашел, кажется ответом на тот же самый вопрос, который у вас есть.

Я надеюсь, что это сообщение достаточно актуально, чтобы решить вашу проблему.

Удачи!

Ответ 2

У меня была такая же проблема, пытаясь обойти эту вещь openOptionsMenu в приложении что я делаю это, должен работать на Android 1.6 и выше. Следуя ответу Вернера Ван Белля, я пришел к выводу, что мы могли бы решить обходной путь для решения проблемы. Поэтому я придумал следующий код: он всегда красив, когда люди не отмечают метод как окончательный, поэтому мы всегда можем его переопределить. Это идеально, если вы не хотите отказываться от таргетинга своего приложения на самую последнюю api (android: targetSdkVersion = "17" ). Надеюсь, вам это понравится.:)

@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();
    }
}

Ответ 3

Чтобы пролить свет на это печальное развитие Google. Очевидно, Google хочет, чтобы все приняли новый ActionBar. Они могли бы добиться этого, сделав ActionBar более простым в использовании, чем старая система меню. Однако это не так, как они планировали переход. Нет, они думали, что для программистов harras было бы разумно сделать невозможным использование старого меню, но без надлежащей обратной совместимости.

Ниже приведен код, взятый из com.android.internal.policy.impl, который должен создать панель optionsMenu. Как вы видите, код просто отказывается создавать панель параметров. Хотя, очевидно, есть. Итак, чтобы ответить на ваш вопрос: забудьте об этом, Google не хочет, чтобы вы больше не использовали эту опциюПанель.

 // Don't open an options panel for honeycomb apps on xlarge devices.
 // (The app should be using an action bar for menu items.)
 if (st.featureId == FEATURE_OPTIONS_PANEL) {
            Context context = getContext();
            Configuration config = context.getResources().getConfiguration();
            boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
                    Configuration.SCREENLAYOUT_SIZE_XLARGE;
            boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
                    android.os.Build.VERSION_CODES.HONEYCOMB;

            if (isXLarge && isHoneycombApp) {
                return;
            }
        }

Ответ 4

Я также не понимаю, как использовать кнопку меню блокировки форсирования. Однако следующий трюк помог мне показать меню на "ограниченных" типах устройств.

Прежде всего нам нужно определить, нужен ли нам следующий хак или нет.

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

Тогда:

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

Не забудьте очистить! (не знаю, если это необходимо, но лучше играть в ролях)

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...
}

Ответ 5

android: targetSdkVersion = "10" в манифесте помог мне. openOptionsMenu() работает так, как ожидается, теперь на ICS+. Кроме того, в нижней части экрана появляется кнопка "переполнение" (на панели кнопок устройства).

ps: Я использую тему NoTitleBar (NoActionBar для sdk 11 и выше) + ViewPagerIndicator Джейком Уортоном.

Ответ 6

Это сработало для меня, мой код очень похож на ваш, и то, что я хочу сделать, - от кнопки на панели действий, откройте меню переполнения:

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

Ответ 7

Вы хотите, чтобы вы показывали кнопку с правой стороны панели действий?

Вот как я сделал:

Рез/меню/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_share"
    android:title="Logout"
    android:icon="@android:drawable/ic_lock_power_off"
    android:orderInCategory="1"
    android:showAsAction="always" />
</menu>


активность 1) принять к сведению ActionBarActivity; 2) MenuInflater в onCreateOptionsMenu 3) onOptionsItemsSelected (я думаю, вам нужно вернуть super.onOptionsItemSelected(item))

public class BaseActivity extends ActionBarActivity {
    ....

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);

    return true;
}
....
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.menu_share:


       //Do something
        break;
    }

    return super.onOptionsItemSelected(item);
}

Ответ 8

Если вы используете свою настраиваемую панель инструментов, вы можете попробовать:

toolBar.showOverflowMenu();