24

Ho un'attività con una barra delle applicazioni e un cassetto di navigazione. La barra delle applicazioni viene implementata utilizzando la nuova classe Toolbar dalla libreria di appcompat-v7 versione 21. + e il cassetto di navigazione viene visualizzato di fronte ad esso.Come rendere la barra ActionMode contestuale sovrapposta alla barra degli strumenti appcompat-v7 ma non al cassetto di navigazione?

L'attività contiene una vista elenco con elementi che possono essere selezionati, quindi viene visualizzata una barra di azione contestuale (CAB). E 'iniziato chiamando:

ActionBarActivity.startSupportActionMode(android.support.v7.view.ActionMode.Callback callback) 

Per impostazione predefinita, il CAB viene inserita sopra la barra degli strumenti, invece di sovrapposizione esso; sembra che il CAB solo sovrapporrà il vero ActionBar per impostazione predefinita. Come esposizione nel this answer, il CAB sovrappone correttamente la barra degli strumenti quando questa proprietà è impostata tema:

<item name="windowActionModeOverlay">true</item> 

Ma questo rende anche il CAB sovrapposizione del cassetto di navigazione, che non è corretto in base alle the Material design specs. I principali documenti di progettazione Android still recommend nascondono il CAB quando il cassetto di navigazione viene aperto e lo mostrano di nuovo quando chiuso, e this could be done per "risolvere" il problema, ma non dovrebbe essere necessario. Come già scritto, le specifiche di progettazione dei materiali non specificano che il CAB deve essere nascosto quando si apre il cassetto della nav, e poiché il cassetto nav dovrebbe aprirsi sopra il CAB, nascondere il CAB sarebbe di fatto una distrazione visiva.

C'è un modo per visualizzare il cassetto di navigazione di fronte al CAB mentre continua a sovrapporre la barra degli strumenti?

risposta

1

Probabilmente ho trovato una soluzione, o forse una soluzione semplice.
Ho avuto lo stesso problema anche con ListFragment, quando è stato utilizzato startActionMode() anziché setChoiceMode() integrato. Così ho esaminato il codice ListFragment e ho trovato che startActionMode() non viene chiamato sull'attività ma piuttosto sul suo ListView, quindi ho provato ad usare una vista. Nel mio codice ora funziona apparentemente come previsto utilizzando il ListView frammento:

ActionMode mActionMode = getListView().startActionMode(this); 

o utilizzando il contenitore di attività che contiene il mio frammento:

View aView = getActivity().findViewById(R.id.container); 
ActionMode mActionMode = aView.startActionMode(this); 

anche:

  • ora il pulsante indietro distrugge la modalità azione mentre prima non era
  • il CAB ora copre correttamente la barra di azione, mentre usin g windowActionModeOverlay nel mio stile copriva solo una parte di esso - almeno nel mio caso
  • l'icona CAB è una freccia indietro piuttosto che un segno di spunta - non so cosa significa se

Per essere onesti io sono Non sono sicuro delle ragioni alla base di questo, quindi non sono sicuro di quanto siano sicure queste soluzioni, tuttavia per il momento sembra funzionare bene.
Se qualcuno ha una migliore comprensione, non esitate a commentare o modificare.

+3

Sto usando un RecyclerView invece di un ListView. Almeno in questo caso, questo non ha funzionato. Il CAB è ancora nel mio cassetto. –