Autore Topic: Toggle menu  (Letto 973 volte)

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Toggle menu
« il: 18 Ottobre 2011, 18:59:05 CEST »
0
Ciao  a tutti,
sto cercando di fare un menu con le seguenti caratteristiche:
- una sola voce di menu
- la prima volta che compare, la voce di menu si chiama "Start" (ed esegue un codice)
- la vota successiva che viene premuto il tasto menu di android, la voce di menu si deve chiamare "Stop"
- la volta successiva di nuovo "Start"
- e cosi' via...

In pratica vorrei fare un toggle. Ho pensato di creare due menu diversi in due file xml diversi, ma non riesco a sostituirle dopo la pressione del menu.
Qualcuno sa come fare?

Grazie mille



Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Toggle menu
« Risposta #1 il: 18 Ottobre 2011, 19:26:07 CEST »
0
Ma se non sbaglio esiste già la view Toggle button.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Toggle menu
« Risposta #2 il: 18 Ottobre 2011, 21:36:08 CEST »
+1
Il metodo onCreateOptionsMenu() viene richiamato una sola volta, se vuoi cambiare il contenuto del menu a runtime devi usare onPrepareOptionsMenu()

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:Toggle menu
« Risposta #3 il: 31 Ottobre 2011, 12:46:17 CET »
0
Il metodo onCreateOptionsMenu() viene richiamato una sola volta, se vuoi cambiare il contenuto del menu a runtime devi usare onPrepareOptionsMenu()

Grazie al tuo consiglio credo di essere sulla strada giusta.
Non sono ancora riuscito a fare quello che volevo. Per ora riesco a togliere una voce di menu, ma non sono ancora riuscito a rimpiazzarla con la stessa negata (per fare il toggle). Quindi riesco a far comparire il menu con start la prima volta, poi clicco su "start" e riesco a rimuovere la voce di menu "start", ma non sono ancora riuscito a far comparire la voce di menu' "stop".

Forse anziche' tramite il menu' xml dovrei crearlo in modo programmatico? O si puo' fare lo stesso?

Grazie mille

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Toggle menu
« Risposta #4 il: 31 Ottobre 2011, 23:58:44 CET »
+1
Ti serve una variabile di flag per sapere quale voce di menu visualizzare e quale rimuovere. Le strade possono essere molte, puoi creare due menu diversi (in xml) e switchare i due menu in base al click della voce "start" o "stop", andando a cambiare una variabile booleana, ad esempio, nel metodo onOptionsItemSelected(MenuItem item). Oppure puoi creare un menu unico con tutti gli elementi, modificando la visibilità delle voci di menu che vuoi mostrare.

Esempio (unico menu con tutti gli elementi) :

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:id="@+id/start"
         android:icon="@drawable/icon"
         android:title="start" />
    <item android:id="@+id/stop"
         android:icon="@drawable/icon"
         android:title="stop"/>
</menu>

Activity :
Codice (Java): [Seleziona]
// crei una variabile di classe che conterrà l'id dell'elemento da visualizzare
private toggleOptionId = R.id.start ;
[...]
// l'onCreateOptionMenu sarà sempre uguale
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.il_nome_del_tuo_menu, menu);
        return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
        // Quando verrà premuto "start" l'elemento
        // da visualizzare successivamente sarà "stop" e viceversa
        switch (item.getItemId()) {
        case R.id.start:
            toggleOptionId = R.id.stop ;
            // ecc...
            return true;
        case R.id.stop:
            toggleOptionId = R.id.start ;
            // ecc...
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
}
// nell'onPrepareOptionMenu visualizzerai l'item con l'id contenuto nella variabile di classe toggleOptionId
// mentre nasconderai l'altro item
@Override
public boolean onPrepareOptionsMenu (Menu menu){
        int toggleOff = R.id.start == toggleOptionId ? R.id.stop : R.id.start ;
        menu.findItem(toggleOptionId).setVisible(true);
        menu.findItem(toggleOff).setVisible(false);
        return true ;
}

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:Toggle menu
« Risposta #5 il: 01 Novembre 2011, 08:31:40 CET »
0
Ti serve una variabile di flag per sapere quale voce di menu visualizzare e quale rimuovere. Le strade possono essere molte, puoi creare due menu diversi (in xml) e switchare i due menu in base al click della voce "start" o "stop", andando a cambiare una variabile booleana, ad esempio, nel metodo onOptionsItemSelected(MenuItem item). Oppure puoi creare un menu unico con tutti gli elementi, modificando la visibilità delle voci di menu che vuoi mostrare.

Esempio (unico menu con tutti gli elementi) :

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:id="@+id/start"
         android:icon="@drawable/icon"
         android:title="start" />
    <item android:id="@+id/stop"
         android:icon="@drawable/icon"
         android:title="stop"/>
</menu>

Activity :
Codice (Java): [Seleziona]
// crei una variabile di classe che conterrà l'id dell'elemento da visualizzare
private toggleOptionId = R.id.start ;
[...]
// l'onCreateOptionMenu sarà sempre uguale
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.il_nome_del_tuo_menu, menu);
        return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
        // Quando verrà premuto "start" l'elemento
        // da visualizzare successivamente sarà "stop" e viceversa
        switch (item.getItemId()) {
        case R.id.start:
            toggleOptionId = R.id.stop ;
            // ecc...
            return true;
        case R.id.stop:
            toggleOptionId = R.id.start ;
            // ecc...
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
}
// nell'onPrepareOptionMenu visualizzerai l'item con l'id contenuto nella variabile di classe toggleOptionId
// mentre nasconderai l'altro item
@Override
public boolean onPrepareOptionsMenu (Menu menu){
        int toggleOff = R.id.start == toggleOptionId ? R.id.stop : R.id.start ;
        menu.findItem(toggleOptionId).setVisible(true);
        menu.findItem(toggleOff).setVisible(false);
        return true ;
}


Ciao Teskio,
grazie per il codice.

Volevo provare anche a switchare tra i due menu, visto che ero partito da quell'idea. Avevo creato una variabile booleana che cambiava stato alla pressione delle due voci di menu (start e stop).
Solo che non riesco a switchare tra i menu.
Ho provato
Codice (Java): [Seleziona]
removeGroup(R.menu.menu1)
ma quando riapro il menu e' ancora li. Poi per inserire il nuovo menu penso basti:
Codice (Java): [Seleziona]
MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.menu2, menu);

Qualche idea?

Grazie

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Toggle menu
« Risposta #6 il: 01 Novembre 2011, 23:15:01 CET »
+1
Se vuoi switchare tra due menu diversi ti basta fare l'override del solo metodo onPrepareOptionMenu(Menu menu), poichè questo metodo viene richiamato sempre a differenza dell'altro che crea il menu una sola volta.
Codice (Java): [Seleziona]
@Override
public boolean onPrepareOptionsMenu (Menu menu){
        // il metodo clear() sull'oggetto menu elimina il menu precedente
        // altrimenti ogni volta si ricrea il menu, questo verrebbe aggiunto
        // a quello già creato...
        menu.clear()
        int menuId = visualizzaMenuUno ? R.menu.menu1 : R.menu.menu2 ;
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(menuId, menu);
        return true ;
}

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:Toggle menu
« Risposta #7 il: 02 Novembre 2011, 10:15:12 CET »
0
Se vuoi switchare tra due menu diversi ti basta fare l'override del solo metodo onPrepareOptionMenu(Menu menu), poichè questo metodo viene richiamato sempre a differenza dell'altro che crea il menu una sola volta.
Codice (Java): [Seleziona]
@Override
public boolean onPrepareOptionsMenu (Menu menu){
        // il metodo clear() sull'oggetto menu elimina il menu precedente
        // altrimenti ogni volta si ricrea il menu, questo verrebbe aggiunto
        // a quello già creato...
        menu.clear()
        int menuId = visualizzaMenuUno ? R.menu.menu1 : R.menu.menu2 ;
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(menuId, menu);
        return true ;
}

Grazie Teskio,
funziona. Ma perche' non avevo pensato a menu.clear()???

Grazie mille.