2014-11-25 9 views
5

Ho un'attività ActionBar con FrameLayout e un menu. quando l'utente fa clic sulla voce di menu, sostituisco il frammento con il nuovo frammento pertinente. Tuttavia, non riesco a vedere un modo ovvio per rimuovere la voce di menu per il frammento selezionato.Android - Come nascondere l'opzione di menu per il frammento corrente

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

La documentazione di Google sul changing menus dice per disattivare il menu in onPrepareOptionsMenu - ma come faccio a sapere quale elemento è stato selezionato?

--Solution Implemented--

Utilizzando la soluzione di Muhammed Refaat seguito ho aggiunto due nuovi membri alla classe:

private Menu activityMenu; 
private MenuItem curMenuItem; 

le pose nel onCreateOptionsMenu

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

E li cambiato su onOptionsItemSelected

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

https: //stackoverflow.com/questions/26420204/changing-visibility-of-menu-items-in-f ragment/47531110 # 47531110 –

risposta

5

prima ottenere l'elemento che si desidera rimuovere:

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

quindi impostare è Visibilità false:

item.setVisible(false); 

e se il problema è a ottenere il menu (come non è nel frammento), è possibile ottenere facilmente un context dall'attività che contiene il menu e ottenere il menu da esso.

+1

Grazie per questo - mettimi sulla strada giusta. Avevo anche bisogno di impostare l'elemento attualmente nascosto visibile, ma era abbastanza facile da risolvere. – QuantumTiger

+0

@QuantumTiger fantastico, felice di poter aiutare :) –

6

All'interno del frammento è necessario utilizzare setHasOptionsMenu(true); per accedere al menu delle opzioni dall'interno del frammento.

codice (all'interno del secondo frammento dove vuoi nascondere l'elemento):

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

Allo stesso modo, per il frammento in cui si desidera mostrare che Menultem si può fare la cosa simile.

3

In aggiunta alla risposta di Muhammed sopra. Una volta che l'elemento è stato impostato come invisibile, potrebbe essere necessario disabilitare anche l'elemento. Nota il commento di Google: "Anche se una voce di menu non è visibile, potrebbe comunque essere richiamata tramite il suo collegamento (per disabilitare completamente un elemento, impostarlo su invisibile e disabilitato)" in setVisible() nella documentazione di MenuItem. così:

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

Aggiungi al di sotto di codici nel vostro frammento

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

Nel frammento in cui si desidera nascondere l'elemento

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

e in onCreate() del frammento

setHasOptionsMenu(true); 
Problemi correlati