2015-05-07 12 views
6

Ho cercato di trovare una risposta a riguardo ma senza fortuna. Ho un frammento che ha una voce di menu chiamata 'menu_roi_result_calc'. Ogni volta che si verifica una rotazione dello schermo, viene creata una nuova voce di menu. Il codice è il seguente:Duplicate ActionBar Button on Rotation

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_roi_result_calc, menu); 
    return true; 
} 

Tuttavia, dopo un paio di rotazioni dello schermo, questo è quello che ottengo:

multiple actionbar menu items

ho la sensazione che questo è dovuto al fatto che il menu gli oggetti vengono ricreati ad ogni rotazione, quindi aggiungendo un nuovo oggetto ogni volta che si verifica una rotazione. Come faccio a smettere? Come posso verificare se l'articolo è presente e impedire di ricrearlo di nuovo? Qualsiasi esempio di codice sarebbe molto apprezzato.

+0

Oltre al codice che mostri qui, aggiungi/rimuovi manualmente qualsiasi pulsante nel menu in qualsiasi altra parte del tuo codice? –

+0

Ciao @AlexStyl, no, tutto ciò che ho è un'attività contenente che chiama onCreateOptionsMenu per aggiungere il pulsante 'Help' (nessun problema lì). Questa stessa attività ospita due frammenti affiancati. Uno dei frammenti ha una chiamata a onCreateOptionsMenu per aggiungere il pulsante della barra delle azioni "Condividi" (quello che vedi ripetuto sullo schermo). Il problema sembra essere con la chiamata ** frammento ** a onCreateOptionsMenu. Devo dire che sto sviluppando esclusivamente per le API di livello 21 e successive. Mi è venuto in mente che forse questo sta accadendo a causa della gestione inadeguata dell'attività di hosting. Ma questa è solo una supposizione. – CBA110

+0

Il codice che hai postato non sembra avere problemi. È possibile che si aggiungano i frammenti all'attività in modo dinamico? Se lo fai, assicurati che l'attività venga ricreata per non aggiungere nuovamente i frammenti? –

risposta

5

Ho scoperto qual era il problema. Non stavo riutilizzando i frammenti taggati originali. Tutto quello che dovevo fare era assicurarsi di controllare savedInstanceState e controllare se un frammento taggato fosse già stato creato ... se si riutilizzasse lo stesso frammento invece di crearne uno nuovo.

1

come soluzione alternativa si potrebbe cancellare il menu, prima di gonfiare di nuovo, chiamando clear

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

rimuove tutte le voci dal menu, lasciando come era stato appena creato

4

È necessario svuotare la oggetto del menu prima di aggiungere elementi. Ho avuto lo stesso problema e questa è stata la soluzione migliore che ho trovato.

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    menu.clear(); 
    inflater.inflate(R.menu.menu_roi_result_calc, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
+0

E se avessi più frammenti ciascuno con il proprio menu? –

+0

È possibile creare il menu delle opzioni in ciascun frammento allo stesso modo. Sostituisci il "onCreateOptionsMenu" di ciascun frammento. –

+0

Non mi sono espresso correttamente. Più frammenti con i propri menu * visualizzati * allo stesso tempo. L'istanza del menu Menu non è fornita dall'attività e quindi comune per l'attività e tutti i suoi frammenti? Se capisco correttamente l'ultimo frammento per chiamare 'onCreateOptionsMenu' sovrascriverebbe l'intero menu con il proprio. Per favore correggimi se sbaglio. –

0

Quando si ruota l'applicazione, l'attività viene distrutta e ne viene creata una nuova. Se si collega il proprio frammento all'attività in cui viene creato, verrà inserito il vecchio e ne verrà aggiunto uno nuovo. Per evitare ciò farei qualcosa di simile in basso. Questo rimuoverà tutti i frammenti correnti e ospiterà qualunque sia il tuo. FragmentManager fm = new FragmentManager(); for(Fragment aFrag : fm.getFragments()) { fm.beginTransaction().remove(aFrag).commit(); } fragment = createFragment(new Fragment()); fm.beginTransaction().add(R.id.YouGetThePicture, fragment).commit();