2012-01-31 39 views
2

我正在使用SDK附帶的ActionBarCompat示例。我的活動過去有菜單項會根據活動的狀態而改變。我會修改菜單,像這樣在onPrepareOptionsMenu()如何在ICS運行時添加/刪除菜單項?

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

這似乎有點尷尬,

感謝

+0

只是確保,你叫'super.onPrepareOptionsMenu(。 )'最後,對吧? – 2012-01-31 23:21:21

+0

嗨,是的。看了這些之後,看起來在SDK 11+中我們可以調用invalidateOptionsMenu(),但在早期版本中我們沒有相同的內容。所以想知道如何在保持代碼一致的前提下在早期的平臺上重建菜單。 – user291701 2012-02-01 10:29:59

+0

使用menu.clear並在需要時重建所需的菜單。 InvalidateOptionsMenu在那裏,因爲沒有按下物理菜單鍵(當使用Actionbar模型時),所以需要知道何時更新。 – Kuffs 2012-02-01 11:19:10

回答

1

示範項目 https://github.com/AlienAsRoger/CourtDeadlines

這是我如何解決它:

在ActionBarHelperBase.java中的actionbarcompat項目

...

private View addActionItemCompatFromMenuItem(final MenuItem item) { 

final int itemId = item.getItemId(); 

....

對象的這類副本屬性的創造者,但並未複製項目的ID,所以不可能與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是一個布爾標誌切換知名度

+0

如何從我的活動中調用此方法? – tobias 2012-12-21 22:40:26

+0

看到更新後 – 2012-12-22 07:14:10

+0

我沒有得到如何這應該工作。爲什麼只在HelperBase中添加showMenuById方法(這只是在Honeycomp之前)?您的代碼不起作用,因爲您不在HelperBase中調用該方法,而是在ActionBarHelper中調用該方法。 – tobias 2012-12-28 01:56:01