Как добавить / удалить пункты меню во время выполнения в ICS? - PullRequest
2 голосов
/ 31 января 2012

Я использую образец ActionBarCompat, который поставляется с SDK. В моей активности были пункты меню, которые менялись в зависимости от состояния активности. Я бы изменил меню как в onPrepareOptionsMenu():

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.clear();

    if (some condition) {
        menu.add(...);
    }
    ...
}

Однако в ICS я считаю, что мы должны изменить пункты меню, вызвав invalidateOptionsMenu(), и тогда наш onCreateOptionsMenu() будет вызван снова. Здесь мы можем удалить пункты меню (не добавлять их). Итак, мы можем получить что-то вроде этого:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (SDK >= 11) {
        // full menu is reloaded from xml every time we 
        // called invalidateOptionsMenu(), so we have a
        // fresh menu here again.
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (SDK >= 11) {
        // we can remove items depending on our state, 
        // but not add any, that's ok.
    }
    else {
        // we only have our original menu instance here,
        // so if we previously had called menu.remove(),
        // we need to call menu.add() here:
        if (foo == true) {
            menu.remove(R.id.menu_item_foo);
        } else {
            menu.add(R.id.menu_item_foo, ...);
        }
    }
}

Это кажется немного неловким,

Спасибо

1 Ответ

1 голос
/ 17 апреля 2012

Демонстрационный проект https://github.com/AlienAsRoger/CourtDeadlines

Вот как я решил это:

В ActionBarHelperBase.java проекта actionbarcompat

...

private View addActionItemCompatFromMenuItem(final MenuItem item) {

final int itemId = item.getItemId();

....

Создатель этого класса скопировал свойства объекта, но не скопировал идентификатор элемента, поэтому его невозможно найти позже с помощью FiveN ID.

Поэтому я добавил это в этом методе:

...
actionButton.setId(itemId);
...

и в том же классе я просто использую:

@Override
public void hideMenuItemById(int id, boolean show){
    getActionBarCompat().findViewById(id).setVisibility(show? View.VISIBLE: View.GONE);
}

Надеюсь, это поможет вам.

ОБНОВЛЕНИЯ:

в ActionBarActivity из примера ActionBarCompat:

package com.chess.ui.activities;

import actionbarcompat.ActionBarActivity;
import actionbarcompat.ActionBarHelper;
import android.app.ActionBar;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.SearchView;
import com.chess.R;
import com.chess.lcc.android.LccHolder;

public abstract class CoreActivityActionBar2 extends ActionBarActivity {

    protected boolean showActionSearch;
    protected boolean showActionSettings;
    protected boolean showActionNewGame;
    protected boolean showActionRefresh;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && getActionBar() != null) {
            getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP
                    | ActionBar.DISPLAY_USE_LOGO
                    | ActionBar.DISPLAY_SHOW_HOME
                    | ActionBar.DISPLAY_SHOW_TITLE);
        }
    }

    @Override
    protected void onStart() {
        if (HONEYCOMB_PLUS_API) {
            adjustActionBar();
        }
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!HONEYCOMB_PLUS_API) {
            adjustActionBar();
        }
    }


    private void adjustActionBar() {
        getActionBarHelper().showMenuItemById(R.id.menu_settings, showActionSettings);
        getActionBarHelper().showMenuItemById(R.id.menu_new_game, showActionNewGame);
        getActionBarHelper().showMenuItemById(R.id.menu_refresh, showActionRefresh);
        getActionBarHelper().showMenuItemById(R.id.menu_search, showActionSearch);
        getActionBarHelper().showMenuItemById(R.id.menu_singOut, LccHolder.getInstance(this).isConnected());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.sign_out, menu);
        getActionBarHelper().showMenuItemById(R.id.menu_singOut, LccHolder.getInstance(this).isConnected(), menu);
        getActionBarHelper().showMenuItemById(R.id.menu_search, showActionSearch, menu);
        getActionBarHelper().showMenuItemById(R.id.menu_settings, showActionSettings, menu);
        getActionBarHelper().showMenuItemById(R.id.menu_new_game, showActionNewGame, menu);
        getActionBarHelper().showMenuItemById(R.id.menu_refresh, showActionRefresh, menu);

        if (HONEYCOMB_PLUS_API) {
            // Get the SearchView and set the searchable configuration
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                backToHomeActivity();
                break;
            case R.id.menu_settings:
                startActivity(new Intent(this, PreferencesScreenActivity.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public ActionBarHelper provideActionBarHelper() {
        return getActionBarHelper();
    }

}

где showActionSettings - логический флаг для переключения видимости

...