2014-11-25 78 views
5

我有一個帶有FrameLayout和菜單的ActionBar活動。當用戶單擊菜單項時,我將該片段替換爲相關的新片段。但是,我看不到一個明顯的方法來刪除所選片段的菜單項。Android - 如何隱藏當前片段的菜單選項

public class MainActivity extends ActionBarActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (savedInstanceState == null) { 
      StudyFragment startFragment = new StudyFragment(); 
      startFragment.setArguments(getIntent().getExtras()); 
      getSupportFragmentManager().beginTransaction().add 
             (R.id.container, startFragment).commit(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     switch (id) { 
     case R.id.action_study: 
      replaceFragment((Fragment)new StudyFragment()); 
      break; 
     case R.id.action_list: 
      replaceFragment((Fragment)new ListFragment()); 
      break; 
     // etc 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void replaceFragment(Fragment f) { 
     FragmentTransaction transaction = 
           getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.container, f); 
     transaction.addToBackStack(null); 

     transaction.commit(); 
     } 

changing menus的谷歌文檔說來禁用onPrepareOptionsMenu菜單 - 但是我怎麼知道哪些項目已被選中?

--Solution Implemented--

使用穆罕默德Refaat的解決方案下面我添加了兩個新成員等級:

private Menu activityMenu; 
private MenuItem curMenuItem; 

擺列onCreateOptionsMenu

activityMenu = menu; 
curMenuItem = activityMenu.findItem(R.id.action_study); 
curMenuItem.setVisible(false); 

而就改變了他們onOptionsItemSelected

curMenuItem.setVisible(true); 
curMenuItem = activityMenu.findItem(id); 
curMenuItem.setVisible(false); 
+0

的https: //stackoverflow.com/questions/26420204/changing-visibility-of-menu-items-in-f細分/ 47531110#47531110 – 2017-11-28 12:06:28

回答

5

首先得到你想要刪除的項目:

MenuItem item = menu.findItem(R.id.your_action); 

然後將它的知名度false

item.setVisible(false); 

,如果問題是獲得菜單(因爲它不是在片段)您可以輕鬆從包含菜單的活動中獲取context,並通過它獲取菜單。

+1

感謝你 - 讓我走上正軌。我還需要設置當前隱藏的項目,但這很容易解決。 – QuantumTiger 2014-11-25 13:51:40

+0

@QuantumTiger太棒了,很高興我可以幫助:) – 2014-11-25 14:10:59

6

在片段中,您必須使用setHasOptionsMenu(true);才能從片段中訪問選項菜單。

代碼(你的第二個片段中,你想隱藏的項目):

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // TODO your code to hide item here 
    super.onCreateOptionsMenu(menu, inflater);  
} 

同樣地,如果你想顯示菜單項,你可以做類似的事情,你的片段。

3

在上面添加到穆罕默德的答案。一旦項目被設置爲不可見,您可能還需要禁用該項目。請注意Google的評論:「即使MenuItem文檔中的setVisible()下的菜單項不可見,它仍可能通過其快捷方式調用(以完全禁用某個項目,將其設置爲不可見和禁用)」。 因此:

  • item.setVisible(false);
  • item。setEnabled(false);
1

添加以下代碼到您的片段

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    MenuItem item = menu.findItem(R.id.save); 
    item.setVisible(false); 
} 
4

在該片段中,你要隱藏的項目

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    MenuItem item=menu.findItem(R.id.action_search); 
    item.setVisible(false); 

,並在你的片段onCreate()

setHasOptionsMenu(true);