2015-05-02 8 views
11

ho queste voci di menu nel mio menu_main.xmlCome attivare/fare clic in modo programmatico su un MenuItem in Android?

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 

    <item android:id="@+id/action_restart" android:title="Restart" 
     android:orderInCategory="1" /> 
    <item android:id="@+id/action_clear" android:title="Clear" 
     android:orderInCategory="2" /> 
    <item android:id="@+id/action_update" android:title="Update" 
     android:orderInCategory="3" /> 
    <item android:id="@+id/action_about" android:title="About" 
     android:orderInCategory="4" /> 
    <item android:id="@+id/action_try_restart" android:title="Try Restart" 
     android:orderInCategory="5" /> 
</menu> 

E ho questo nel mio onOptionsItemSelected metodo:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    if (id == R.id.action_restart) { 
     Toast.makeText(MainActivity.this, "Restart...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_clear) { 
     Toast.makeText(MainActivity.this, "Clear...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_update) { 
     Toast.makeText(MainActivity.this, "Update...", Toast.LENGTH_LONG).show(); 
    } 

    if (id == R.id.action_about) { 
     Toast.makeText(MainActivity.this, "About...", Toast.LENGTH_LONG).show(); 
    } 

    if(id == R.id.action_try_restart) { 
     // how to click/trigger the "action_restart" from here? 
    } 

    return super.onOptionsItemSelected(item); 
} 

ho provato con:

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart); 
actionRestart; // 

Ma actionRestart riferimento doesn' t offrire qualcosa come click, trigger, ecc.

Vorrei anche notare che sono nuovo nello sviluppo di Android e che provengo da PHP/JavaScript, quindi questo livello di Java OOP è tutto nuovo per me.

risposta

7

Per quanto ne so, nell'SDK non vi è alcun meccanismo che consenta di farlo. Non è certamente una pratica normale fare questo genere di cose.

Si consiglia di separare il più possibile la logica dall'interfaccia utente effettiva, quindi non è necessario per richiedere un per simulare un clic per attivare l'azione. Dato che sei uno sviluppatore Web, questo dovrebbe venire abbastanza facilmente a te.

In questo caso, si consiglia di rifattorizzare i toasts in un metodo separato (o più metodi), quindi chiamare quello quando si fa clic sulla voce di menu e quando si desidera attivarla manualmente.

In alternativa, si potrebbe provare a prendere il MenuItem restituito da findViewById() e passarlo al gestore qui. Ma non ho idea se funzionerà.

+1

Grazie amici/Hvala Zemljače! Ho fatto un metodo separato in cui lo chiamo su entrambi; 'action_restart' e' action_try_restart', quindi ora si adatta alle mie esigenze. Saluti! – omerowitz

+0

puoi usare il metodo performIdentifierAction – Simon

10

È necessario chiamare manualmente l'ascoltatore, con l'elemento richiesto come parametro.

MenuItem actionRestart = (MenuItem) findViewById(R.id.action_restart); 
onOptionsItemSelected(actionRestart); 
+2

Lo proverò anche io! Ho fatto un metodo separato, come ho descritto sopra nella risposta di Veselin Romic. Grazie anche a te. – omerowitz

+3

java.lang.ClassCastException: android.support.v7.view.menu.ActionMenuItemView non può essere lanciato su android.view.MenuItem –

3

Anche se non è il modo migliore per farlo,

MenuItem item_your_choice; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.your_menu, menu); 
    item_your_choice = menu.findItem(R.id.item_your_choice); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case item_your_choice: 
    //do whatever you want 
    break; 
} 

just Call from any method 
    onOptionsItemSelected(item_you_choice); 
-2

C'è un metodo standard per fare questo -
creare una nuova istanza di MenuItem classe e di modificare il metodo di override getItemId() per tornare l'id della voce di menu desiderata e lascia il resto invariato.

MenuItem actionRestart = new MenuItem() { 
              @Override 
              public int getItemId() { 
               return R.id.action_restart; 
              } 

              ... 

              }; 
onOptionsItemSelected(actionRestart); 
+0

Questo sostituirà tutto il metodo dell'interfaccia MenuItem, il che rende il tuo codice disordinato – AimanB

3

Vorrei condividere la mia soluzione anche qui. Invece di provare a fare clic in modo programmatico su una voce di menu, ho creato un metodo separato per fare clic su una voce di menu, e lo chiamo ovunque sia necessario fare clic sulla voce di menu. Il metodo OnOptionsItemSelected ha il seguente aspetto. Come puoi vedere ho spostato la logica dei clic su un metodo separato.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home) { 
     homeClicked(); 
    } 
    return super.onOptionsItemSelected(item); 
} 
private void homeClicked(){ 
    ... 
} 

Ora si può chiamare in qualsiasi momento homeClicked è necessario cliccare la voce di menu di programmazione.

+1

un buon approccio come noi don ' t avere un metodo nativo – MilapTank

1

Utilizzare il metodo performIdentifierAction, come questo:

menu.performIdentifierAction(R.id.action_restart, 0); 
0

Come per il tuo esempio per la voce di menu di cui sopra:

<item android:id="@+id/action_restart" android:title="Restart" 
     android:orderInCategory="1" /> 

uso callOnClick() metodo:

((ActionMenuItemView)findViewById(R.id.action_restart)).callOnClick(); 
Problemi correlati