I menu sono un componente dell'interfaccia utente comune in molti tipi di app. A
per offrire un'esperienza utente familiare e coerente, utilizza
Menu
API per
presentano azioni dell'utente e altre opzioni nelle tue attività.
Questo documento mostra come creare i tre tipi fondamentali di menu o presentazioni di azioni su tutte le versioni di Android:
- Menu Opzioni e barra delle app
- Il menu Opzioni è la raccolta principale di portate principali per una
attività. È la piattaforma in cui vengono inserite le azioni che hanno un impatto globale sui
come "Ricerca", "Scrivi email" e "Impostazioni".
Vedi il menu Crea un opzioni .
- Menu contestuale e modalità di azione contestuale
- Un menu contestuale è un menu mobile
che appare quando l'utente esegue un tocco e tieni premuto un elemento. it
fornisce azioni che influiscono sui contenuti o sul frame di contesto selezionati.
La modalità di azione contestuale mostra le attività che influisce sui contenuti selezionati in una barra nella parte superiore dello schermo e consente selezionare più elementi dall'utente.
Consulta la sezione Creare un menu contestuale .
- Menu popup
- Un menu popup mostra un elenco verticale di elementi ancorati allo
che richiama il menu. È utile per offrire tantissime azioni
che riguardano contenuti specifici o che offrono opzioni per la seconda parte
di un comando. Le azioni in un menu popup non influiscono direttamente sul
contenuti corrispondenti: è a questo che servono le azioni contestuali. Piuttosto,
il menu popup è dedicato alle azioni estese relative alle regioni di contenuti in
la tua attività.
Consulta la sezione Creare un menu popup.
Definisci un menu in XML
Per tutti i tipi di menu, Android fornisce un formato XML standard per definire il menù
elementi. Anziché creare un menu nel codice dell'attività, definisci un menu e
tutti gli elementi in un file XML
risorsa del menu. Puoi
quindi gonfia la risorsa del menu, caricandola come Menu
nell'attività o nel frammento.
L'utilizzo di una risorsa di menu è una buona prassi per i seguenti motivi:
- È più facile visualizzare la struttura dei menu in XML.
- I contenuti del menu vengono separati dai comportamenti dell'app le API nel tuo codice.
- Consente di creare configurazioni di menu alternative per piattaforme diverse versioni, dimensioni dello schermo e altre configurazioni, risorse per app il modello di machine learning.
Per definire un menu, crea un file XML all'interno della cartella
res/menu/
e crea il menu con quanto segue
elementi:
<menu>
- Definisci un
Menu
, che è un contenitore per le voci di menu. R L'elemento<menu>
deve essere il nodo radice del file e può contenere uno o più<item>
e<group>
elementi. <item>
- Crea un
MenuItem
, che rappresenta una singola voce di un menu. Questo elemento può contenere un elemento nidificato<menu>
elemento per creare un sottomenu. <group>
- Un contenitore invisibile facoltativo per
<item>
elementi. Ti permette di classificare le voci di menu in modo che condividano le proprietà, come come stato attivo e visibilità. Per ulteriori informazioni, consulta Sezione Crea un gruppo di menu.
Ecco un menu di esempio denominato game_menu.xml
:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" app:showAsAction="ifRoom"/> <item android:id="@+id/help" android:icon="@drawable/ic_help" android:title="@string/help" /> </menu>
L'elemento <item>
supporta diversi attributi che puoi utilizzare
per definire l'aspetto e il comportamento di un articolo. Le voci del menu precedente
includono i seguenti attributi:
android:id
- Un ID risorsa univoco dell'elemento, che consente all'app riconoscere l'elemento quando l'utente lo seleziona.
android:icon
- Un riferimento a un elemento disegnabile da utilizzare come icona dell'elemento.
android:title
- Un riferimento a una stringa da utilizzare come titolo dell'elemento.
android:showAsAction
- La specifica relativa a quando e come questo elemento viene visualizzato come attività nella barra delle app.
Questi sono gli attributi più importanti che utilizzi, ma ce ne sono molti altri disponibili. Per informazioni su tutti gli attributi supportati, consulta Risorsa del menu documentazione.
Puoi aggiungere un sottomenu a una voce in qualsiasi menu aggiungendo un'opzione
<menu>
come elemento secondario di un <item>
.
I sottomenu sono utili quando l'app ha molte funzioni che possono essere organizzate
in argomenti, come gli elementi nella barra dei menu di un'app per PC, come File,
Modifica e Visualizza. Vedi l'esempio che segue:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="@string/file" > <!-- "file" submenu --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
Per usare il menu nella tua attività, _inflate_ la risorsa del menu, convertendo
la risorsa XML in un oggetto programmabile
MenuInflater.inflate()
.
Le seguenti sezioni mostrano come aumentare in modo artificioso un menu per ogni tipo di menu.
Crea un menu opzioni
Nel menu delle opzioni, come quello mostrato nella figura 1, puoi includere azioni e altre opzioni pertinenti al contesto dell'attività corrente, ad esempio "Ricerca", "Scrivi email" e "Impostazioni".
Puoi dichiarare gli elementi del menu opzioni dal tuo
Activity
o una sottoclasse
Fragment
sottoclasse del modello. Se sia l'attività che i frammenti dichiarano elementi per
gli elementi vengono combinati nell'interfaccia utente. Gli elementi dell'attività vengono visualizzati
seguite da quelle di ogni frammento, nell'ordine in cui i frammenti
vengono aggiunti all'attività. Se necessario, puoi riordinare le voci del menu con
l'attributo android:orderInCategory
in ogni
<item>
da spostare.
Per specificare il menu opzioni per un'attività, sostituisci
onCreateOptionsMenu()
.
I frammenti forniscono il proprio
onCreateOptionsMenu()
di Google. Con questo metodo puoi
gonfiare la risorsa del menu,
definita in XML, nel Menu
fornito in
di Google. Ciò è mostrato nell'esempio seguente:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.game_menu, menu) return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); return true; }
Puoi aggiungere voci di menu anche utilizzando
add()
e recuperare elementi
findItem()
di rivedere le proprietà con le API di MenuItem
.
Gestire gli eventi di clic
Quando l'utente seleziona un elemento dal menu opzioni, incluse le attività
nella barra delle app, il sistema chiama la tua attività
onOptionsItemSelected()
. Questo metodo trasmette il valore MenuItem
selezionato. Puoi identificare
dell'elemento richiamando
getItemId()
,
che restituisce l'ID univoco della voce di menu, definito dal
Attributo android:id
nella risorsa di menu o con un numero intero specificato
al metodo add()
. Puoi associare questo ID al menu noto
per eseguire l'azione appropriata.
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle item selection. return when (item.itemId) { R.id.new_game -> { newGame() true } R.id.help -> { showHelp() true } else -> super.onOptionsItemSelected(item) } }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection. switch (item.getItemId()) { case R.id.new_game: newGame(); return true; case R.id.help: showHelp(); return true; default: return super.onOptionsItemSelected(item); } }
Quando gestisci correttamente una voce di menu, restituisci true
. Se
non gestire la voce di menu, chiama l'implementazione superclass
onOptionsItemSelected()
. L'implementazione predefinita restituisce
false.
Se l'attività include frammenti, il sistema prima chiama
onOptionsItemSelected()
per l'attività, poi per ogni frammento
nell'ordine in cui vengono aggiunti i frammenti, finché uno non restituisce true
o
vengono chiamati tutti i frammenti.
Modificare le voci di menu in fase di esecuzione
Dopo che il sistema chiama onCreateOptionsMenu()
, conserva un
dell'istanza di Menu
che compili e non chiama
onCreateOptionsMenu()
di nuovo a meno che il menu non venga invalidato.
Tuttavia, usa onCreateOptionsMenu()
solo per creare il menu iniziale
e non apportare modifiche durante il ciclo di vita dell'attività.
Se vuoi modificare il menu opzioni in base agli eventi che si verificano durante
ciclo di vita dell'attività, puoi farlo
onPrepareOptionsMenu()
. Questo metodo ti trasmette l'oggetto Menu
così come è attualmente
esiste in modo che tu possa modificarlo, ad esempio aggiungendo, rimuovendo o disattivando elementi.
I frammenti forniscono anche
onPrepareOptionsMenu()
di Google.
Il menu opzioni è considerato sempre aperto quando le voci di menu sono presentate in
la barra delle app. Quando si verifica un evento e vuoi eseguire un aggiornamento del menu, chiama
invalidateOptionsMenu()
per richiedere che il sistema chiami onPrepareOptionsMenu()
.
Creare un menu contestuale
Un menu contestuale offre azioni che hanno effetto su un elemento o un contesto specifico
nell'interfaccia utente. Puoi fornire un menu contestuale per qualsiasi visualizzazione, ma in genere sono
spesso utilizzato per gli elementi in
RecylerView
o
altre raccolte in cui l'utente può eseguire azioni dirette
molto utile.
Esistono due modi per fornire azioni contestuali:
- In un menu contestuale mobile. Un menu appare come un elenco mobile di voci di menu, simile a una finestra di dialogo, quando l'utente esegue un tocco e una vista che dichiara il supporto di un contesto o dal menu Fogli Google. Gli utenti possono eseguire un'azione contestuale su un elemento alla volta.
- In modalità di azione contestuale. Questa modalità è un sistema
dell'implementazione
ActionMode
che visualizza una barra delle azioni contestuali, o CAB, nella parte superiore della schermata con le attività che hanno effetto sugli elementi selezionati. Quando questa modalità sia attiva, gli utenti possono eseguire un'azione su più elementi contemporaneamente, se l'app supporta questa funzionalità.
Nota:il menu contestuale non supporta le scorciatoie degli elementi e le icone degli elementi.
Creare un menu contestuale mobile
Per fornire un menu contestuale mobile, procedi nel seguente modo:
- Registra il
View
a cui è associato il menu contestuale chiamataregisterForContextMenu()
passandoView
.Se per la tua attività viene usato un
RecyclerView
e vuoi che per fornire lo stesso menu contestuale, registra tutti gli elementi per un contesto passandoRecyclerView
aregisterForContextMenu()
. - Implementa il
onCreateContextMenu()
inActivity
oFragment
.Quando la visualizzazione registrata riceve un tocco e di attesa, il sistema chiama il tuo metodo
onCreateContextMenu()
. È qui che definisci le voci di menu, di solito gonfiando una risorsa di menu, come nell'esempio seguente esempio:Kotlin
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo) { super.onCreateContextMenu(menu, v, menuInfo) val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.context_menu, menu) }
Java
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }
MenuInflater
consente di gonfiare il menu contestuale da una risorsa di menu. Il metodo di callback includono il valoreView
selezionato dall'utente e un valoreContextMenu.ContextMenuInfo
che fornisce informazioni aggiuntive sull'elemento selezionato. Se la tua attività ha diverse visualizzazioni, ciascuna delle quali fornisce un diverso menu contestuale, puoi utilizzare questi parametri per stabilire quale menu contestuale gonfiare. Implementa
onContextItemSelected()
, come mostrato nell'esempio seguente. Quando l'utente seleziona una voce di menu, il sistema chiama questo metodo affinché tu possa eseguire l'azione appropriata.Kotlin
override fun onContextItemSelected(item: MenuItem): Boolean { val info = item.menuInfo as AdapterView.AdapterContextMenuInfo return when (item.itemId) { R.id.edit -> { editNote(info.id) true } R.id.delete -> { deleteNote(info.id) true } else -> super.onContextItemSelected(item) } }
Java
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }
getItemId()
esegue query sull'ID della voce di menu selezionata, che assegni a ogni una voce di menu in XML utilizzando l'attributoandroid:id
, come mostrato in Definisci un menu in XML.Quando gestisci correttamente una voce di menu, restituisci
true
. Se non gestisci la voce di menu, passala alla superclasse implementazione. Se l'attività include frammenti, l'attività riceve prima questo callback. Chiamando la superclasse se non gestita, il sistema passa l'evento al rispettivo metodo di callback in ogni frammento, uno in volta, nell'ordine di aggiunta di ogni frammento, fino atrue
o Viene restituitofalse
. Le implementazioni predefinite per Reso diActivity
eandroid.app.Fragment
false
, quindi chiama sempre la superclasse se non viene gestita.
Utilizzare la modalità di azione contestuale
La modalità di azione contestuale è un'implementazione
ActionMode
che concentra l'interazione dell'utente sul rendimento
azioni contestuali. Quando un utente attiva questa modalità selezionando un elemento, viene visualizzata una
La barra delle azioni contestuali viene visualizzata nella parte superiore dello schermo per presentare
azioni che l'utente può eseguire sugli elementi selezionati. Quando questa modalità è attiva,
l'utente può selezionare più elementi, se la tua app supporta questa funzionalità, e può deselezionare
articoli e continua a navigare all'interno dell'attività. La modalità di azione è disattivata
e la barra delle azioni contestuali
scompare quando l'utente deseleziona tutti gli elementi.
tocca il pulsante Indietro o l'azione Fatto sul lato sinistro
.
Per le visualizzazioni che forniscono azioni contestuali, di solito richiami modalità di azione quando si verifica uno o entrambi questi due eventi:
- L'utente esegue un tocco e tieni premuto sulla vista.
- L'utente seleziona una casella di controllo o un componente dell'interfaccia utente simile all'interno della vista.
Il modo in cui l'app richiama la modalità di azione contestuale e definisce il comportamento di ogni azione dipende dalla progettazione. Esistono due design:
- Per azioni contestuali su singole visualizzazioni arbitrarie.
- Per azioni contestuali collettive su gruppi di elementi in un
RecyclerView
, che consente all'utente di selezionare più elementi e eseguire un'azione su tutti questi elementi.
Le seguenti sezioni descrivono la configurazione richiesta per ogni scenario.
Attivare la modalità di azione contestuale per le singole visualizzazioni
Se vuoi richiamare la modalità di azione contestuale solo quando l'utente seleziona viste specifiche, procedi nel seguente modo:
- Implementa l'interfaccia
ActionMode.Callback
come mostrato in dall'esempio seguente. Nei suoi metodi di callback, puoi specificare le azioni per la barra delle azioni contestuali, rispondere agli eventi di clic sulle attività e e gestire altri eventi del ciclo di vita per la modalità di azione.Kotlin
private val actionModeCallback = object : ActionMode.Callback { // Called when the action mode is created. startActionMode() is called. override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { // Inflate a menu resource providing context menu items. val inflater: MenuInflater = mode.menuInflater inflater.inflate(R.menu.context_menu, menu) return true } // Called each time the action mode is shown. Always called after // onCreateActionMode, and might be called multiple times if the mode // is invalidated. override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { return false // Return false if nothing is done } // Called when the user selects a contextual menu item. override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_share -> { shareCurrentItem() mode.finish() // Action picked, so close the CAB. true } else -> false } } // Called when the user exits the action mode. override fun onDestroyActionMode(mode: ActionMode) { actionMode = null } }
Java
private ActionMode.Callback actionModeCallback = new ActionMode.Callback() { // Called when the action mode is created. startActionMode() is called. @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items. MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } // Called each time the action mode is shown. Always called after // onCreateActionMode, and might be called multiple times if the mode // is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; // Return false if nothing is done. } // Called when the user selects a contextual menu item. @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_share: shareCurrentItem(); mode.finish(); // Action picked, so close the CAB. return true; default: return false; } } // Called when the user exits the action mode. @Override public void onDestroyActionMode(ActionMode mode) { actionMode = null; } };
Questi callback di eventi sono quasi esattamente uguali ai callback per il menu opzioni, tranne che per ciascuna trasmette anche l'oggetto
ActionMode
associato all'evento. Puoi utilizzare le API diActionMode
per apportare varie modifiche alle CAB, ad esempio la revisione del titolo e dei sottotitoli consetTitle()
esetSubtitle()
, il che è utile per indicare quanti elementi sono stati selezionati.L'esempio precedente imposta la variabile
actionMode
sunull
quando la modalità di azione viene eliminata. Nel passaggio successivo, come viene inizializzata e come viene salvata la variabile membro nell'attività o può essere utile. - Chiama
startActionMode()
quando vuoi mostrare la barra, ad esempio quando l'utente esegue un tocco e tieni premuto sulla vista.Kotlin
someView.setOnLongClickListener { view -> // Called when the user performs a touch & hold on someView. when (actionMode) { null -> { // Start the CAB using the ActionMode.Callback defined earlier. actionMode = activity?.startActionMode(actionModeCallback) view.isSelected = true true } else -> false } }
Java
someView.setOnLongClickListener(new View.OnLongClickListener() { // Called when the user performs a touch & hold on someView. public boolean onLongClick(View view) { if (actionMode != null) { return false; } // Start the CAB using the ActionMode.Callback defined earlier. actionMode = getActivity().startActionMode(actionModeCallback); view.setSelected(true); return true; } });
Quando chiami
startActionMode()
, il sistema restituisce ilActionMode
creato. Se salvi questa opzione in una variabile membro, può apportare modifiche alla barra delle azioni contestuali in risposta ad altri eventi. Nell'esempio precedente,ActionMode
viene utilizzato per garantire che l'istanzaActionMode
non viene ricreata se è già sia attiva, controllando se il membro è nullo prima di iniziare l'azione. .
Crea un menu popup
PopupMenu
è un menu modale ancorato a View
. Appare sotto l'ancoraggio
se c'è spazio, oppure sopra la vista. È utile per
seguenti:
- Offrire un menu in stile extra per le azioni relative a contenuti specifici, come le intestazioni delle email di Gmail, mostrati nella Figura 4.
- Fornire una seconda parte di una frase di comando, ad esempio un pulsante contrassegnato Aggiungi, che produce un menu popup con diverse opzioni Aggiungi le opzioni di CPU e memoria disponibili.
- Fornire un menu simile a
Spinner
che non conserva una selezione permanente.
Se definisci il tuo menu in XML, ecco come puoi mostrare il menu popup:
- Crea un'istanza di
PopupMenu
con il relativo costruttore, che prende l'app correnteContext
eView
a cui è ancorato il menu. - Usa
MenuInflater
per aumentare in modo artificioso la risorsa di menu nel OggettoMenu
restituito daPopupMenu.getMenu()
. - Chiama il numero
PopupMenu.show()
.
Ad esempio, ecco un pulsante che mostra un menu popup:
<ImageButton android:id="@+id/dropdown_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/descr_overflow_button" android:src="@drawable/arrow_drop_down" />
L'attività può quindi mostrare un menu popup in questo modo:
Kotlin
findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener { val popup = PopupMenu(this, it) val inflater: MenuInflater = popup.menuInflater inflater.inflate(R.menu.actions, popup.menu) popup.show() }
Java
findViewById(R.id.dropdown_menu).setOnClickListener(v -> { PopupMenu popup = new PopupMenu(this, v); popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu()); popup.show(); });
Il menu viene ignorato quando l'utente seleziona un elemento o tocca un punto fuori dal menu
geografica specifica. Puoi rimanere in ascolto dell'evento ignora utilizzando
PopupMenu.OnDismissListener
.
Gestire gli eventi di clic
Per eseguire un'azione quando l'utente seleziona una voce di menu, implementa l'oggetto
PopupMenu.OnMenuItemClickListener
e registrala con il tuo PopupMenu
chiamando
setOnMenuItemclickListener()
.
Quando l'utente seleziona un elemento, il sistema chiama la
onMenuItemClick()
nell'interfaccia.
Ciò è mostrato nell'esempio seguente:
Kotlin
fun showMenu(v: View) { PopupMenu(this, v).apply { // MainActivity implements OnMenuItemClickListener. setOnMenuItemClickListener(this@MainActivity) inflate(R.menu.actions) show() } } override fun onMenuItemClick(item: MenuItem): Boolean { return when (item.itemId) { R.id.archive -> { archive(item) true } R.id.delete -> { delete(item) true } else -> false } }
Java
public void showMenu(View v) { PopupMenu popup = new PopupMenu(this, v); // This activity implements OnMenuItemClickListener. popup.setOnMenuItemClickListener(this); popup.inflate(R.menu.actions); popup.show(); } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.archive: archive(item); return true; case R.id.delete: delete(item); return true; default: return false; } }
Creare un gruppo di menu
Un gruppo di menu è una raccolta di portate del menù che condividono determinate caratteristiche. Con un di Google, puoi effettuare le seguenti operazioni:
- Mostra o nascondi tutti gli elementi utilizzando
setGroupVisible()
. - Attiva o disattiva tutti gli elementi utilizzando
setGroupEnabled()
. - Specifica se tutti gli elementi possono essere controllati utilizzando
setGroupCheckable()
.
Puoi creare un gruppo nidificando <item>
elementi all'interno
un elemento <group>
nella risorsa di menu o specificando
ID gruppo con
add()
.
Ecco un esempio di risorsa di menu che include un gruppo:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_save" android:icon="@drawable/menu_save" android:title="@string/menu_save" /> <!-- menu group --> <group android:id="@+id/group_delete"> <item android:id="@+id/menu_archive" android:title="@string/menu_archive" /> <item android:id="@+id/menu_delete" android:title="@string/menu_delete" /> </group> </menu>
Gli elementi presenti nel gruppo vengono visualizzati allo stesso livello del primo
voce: tutti e tre gli elementi nel menu sono elementi di pari livello. Tuttavia, puoi modificare
le caratteristiche dei due elementi del gruppo, facendo riferimento all'ID gruppo e utilizzando
metodi precedenti. Inoltre, il sistema non separa mai gli elementi raggruppati. Per
Ad esempio, se dichiari android:showAsAction="ifRoom"
per ogni
dell'elemento, vengono visualizzati entrambi nella barra delle azioni oppure entrambi vengono visualizzati nell'azione
dell'overflow.
Utilizza voci di menu selezionabili
Un menu può essere utile come interfaccia per attivare e disattivare le opzioni, utilizzando una casella di controllo per le opzioni autonome o pulsanti di opzione per gruppi di ed esclusive. La figura 5 mostra un sottomenu con voci selezionabili con pulsanti di opzione.
Puoi definire il comportamento verificabile per singole voci di menu utilizzando il
Attributo android:checkable
in <item>
o per un intero gruppo con l'elemento android:checkableBehavior
nell'elemento <group>
. Ad esempio, tutti gli elementi in
questo gruppo di menu è controllabile con un pulsante di opzione:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="@string/red" /> <item android:id="@+id/blue" android:title="@string/blue" /> </group> </menu>
L'attributo android:checkableBehavior
accetta uno dei
seguenti:
single
- È possibile selezionare solo un elemento del gruppo, con conseguente selezione di pulsanti pulsanti.
all
- È possibile selezionare tutti gli elementi, quindi anche le caselle di controllo.
none
- Nessun elemento selezionabile.
Puoi applicare uno stato selezionato predefinito a un elemento utilizzando il metodo
Attributo android:checked
nell'elemento <item>
e modificarlo nel codice con
setChecked()
.
Quando è selezionato un elemento selezionabile, il sistema chiama il rispettivo
metodo di callback selezionato dall'elemento, ad esempio onOptionsItemSelected()
.
È qui che imposti lo stato della casella di controllo, perché una casella di controllo o un pulsante di opzione
non cambia automaticamente lo stato. Puoi eseguire query sullo stato attuale
dell'articolo, com'era prima che l'utente lo selezionasse, con
isChecked()
quindi imposta lo stato selezionato con setChecked()
. Ciò viene mostrato in
nell'esempio seguente:
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.vibrate, R.id.dont_vibrate -> { item.isChecked = !item.isChecked true } else -> super.onOptionsItemSelected(item) } }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.vibrate: case R.id.dont_vibrate: if (item.isChecked()) item.setChecked(false); else item.setChecked(true); return true; default: return super.onOptionsItemSelected(item); } }
Se non imposti lo stato selezionato in questo modo, lo stato visibile la casella di controllo o il pulsante di opzione non cambia quando l'utente lo seleziona. Se lo fai lo stato, l'attività conserva lo stato selezionato dell'elemento in modo quando l'utente aprirà il menu in un secondo momento, lo stato selezionato che hai impostato è visibile.
Aggiungere voci di menu in base a un'intenzione
A volte desideri che una voce di menu avvii un'attività utilizzando un
Intent
,
che si tratti di un'attività nella tua app o in un'altra app. Quando
l'intento che vuoi usare e avere una voce di menu specifica che avvia
l'intent, lo puoi eseguire
startActivity()
durante il metodo di callback appropriato all'elemento selezionato, come il
Chiamata onOptionsItemSelected()
.
Tuttavia, se non hai la certezza che il dispositivo dell'utente contenga un'app che gestisce l'intent, quindi l'aggiunta di una voce di menu che lo richiami può comportare voce di menu non funzionante perché l'intento potrebbe non corrispondere a un'attività. Per risolvere il problema, Android ti consente di aggiungere dinamicamente voci di menu al menu quando Android trova sul dispositivo le attività che gestiscono le tue intenzioni.
Per aggiungere voci di menu in base alle attività disponibili che accettano un intento, procedi nel seguente modo: le seguenti:
- Definisci un intent con la categoria
CATEGORY_ALTERNATIVE
oCATEGORY_SELECTED_ALTERNATIVE
, o entrambi, più eventuali altri requisiti. - Chiama
Menu.addIntentOptions()
. Android cerca quindi tutte le app in grado di eseguire l'intento le aggiunge al tuo menu.
Se non ci sono app installate che soddisfano l'intento, non verrà visualizzato alcun menu. vengono aggiunti.
Ciò è mostrato nell'esempio seguente:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { super.onCreateOptionsMenu(menu) // Create an Intent that describes the requirements to fulfill, to be // included in the menu. The offering app must include a category value // of Intent.CATEGORY_ALTERNATIVE. val intent = Intent(null, dataUri).apply { addCategory(Intent.CATEGORY_ALTERNATIVE) } // Search and populate the menu with acceptable offering apps. menu.addIntentOptions( R.id.intent_group, // Menu group to which new items are added. 0, // Unique item ID (none). 0, // Order for the items (none). this.componentName, // The current activity name. null, // Specific items to place first (none). intent, // Intent created above that describes the requirements. 0, // Additional flags to control items (none). null) // Array of MenuItems that correlate to specific items (none). return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); // Create an Intent that describes the requirements to fulfill, to be // included in the menu. The offering app must include a category value // of Intent.CATEGORY_ALTERNATIVE. Intent intent = new Intent(null, dataUri); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); // Search and populate the menu with acceptable offering apps. menu.addIntentOptions( R.id.intent_group, // Menu group to which new items are added. 0, // Unique item ID (none). 0, // Order for the items (none). this.getComponentName(), // The current activity name. null, // Specific items to place first (none). intent, // Intent created above that describes the requirements. 0, // Additional flags to control items (none). null); // Array of MenuItems that correlate to specific items (none). return true; }
Per ogni attività trovata che fornisce un filtro di intent corrispondente all'intent
definita, viene aggiunta una voce di menu utilizzando il valore nel filtro per intent
android:label
come titolo della voce di menu e icona dell'app come menu
icona elemento. Il metodo addIntentOptions()
restituisce il numero di
voci di menu aggiunte.
Consenti di aggiungere la tua attività ad altri menu
Puoi offrire i servizi della tua attività ad altre app in modo che la tua app possa nel menu di altri, invertendo i ruoli descritti in precedenza.
Da includere in altri menu delle app, definisci un filtro per intent come di consueto,
ma includi i campi CATEGORY_ALTERNATIVE
o
Valori di CATEGORY_SELECTED_ALTERNATIVE
, o entrambi, per l'intento
categoria di filtro. Ciò è mostrato nell'esempio seguente:
<intent-filter label="@string/resize_image"> ... <category android:name="android.intent.category.ALTERNATIVE" /> <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> ... </intent-filter>
Scopri di più sulla scrittura di filtri per intent in Intenzioni e intenzione filtri.