Autore Topic: come fare un unico menu per tutte le activity  (Letto 1335 volte)

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
come fare un unico menu per tutte le activity
« il: 09 Settembre 2010, 09:35:30 CEST »
0
Ho creato un'app che ha 6 activity
in ognuna ho fatto l'override dei metodi:

onCreateOptionsMenu
onOptionsItemSelected

per creare il menu, però il menu èè lo stesso identico per tutte le activity
come posso fare a definire il mio menu in un unico punto in modo che tutte le mie activity usino quello?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #1 il: 09 Settembre 2010, 09:41:19 CEST »
0
Crei una classe MyMenu dove inoltri tutte le chiamate a onCreateOptionsMenu e onOptionsItemSelected! ;)

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:come fare un unico menu per tutte le activity
« Risposta #2 il: 09 Settembre 2010, 10:21:33 CEST »
0
ho due dubbi:
1 ) siccome sono metodi in override bisogna che la classe MyMenu estenda Activity gusto?
2) inoltre i metodi non potendo fare i metodi statici, in ogni activity devo istanziare la classe MyMenu

è tutto corretto?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #3 il: 09 Settembre 2010, 11:26:37 CEST »
+2
1) No.
2) Si, è consigliabile.

Lo scheletro è questo:
Codice (Java): [Seleziona]
public class SharedMenuActivity extends Activity {
        private MyMenu mMyMenu;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mMyMenu = new MyMenu(this);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                mMyMenu.onCreateOptionsMenu(menu);
                return super.onCreateOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                mMyMenu.onOptionsItemSelected(item);
                return super.onOptionsItemSelected(item);
        }
}

e
Codice (Java): [Seleziona]
public class MyMenu {
        private Activity mRootActivity;
       
        public MyMenu(Activity rootActivity) {
                mRootActivity = rootActivity;
        }

        public boolean onCreateOptionsMenu(Menu menu) {
                MenuInflater menuInflater = mRootActivity.getMenuInflater();
                menuInflater.inflate(R.menu.sharedmenu, menu);
                return true;
        }

        public boolean onOptionsItemSelected(MenuItem item) {
                switch(item.getItemId()) {
                        // TODO: ...
                }
                return true;
        }
}

Ovviamente puoi attuare mille varianti, tipo creare MyMenu come singleton (cosa che sconsiglio), ma la base è questa!

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:come fare un unico menu per tutte le activity
« Risposta #4 il: 09 Settembre 2010, 11:52:32 CEST »
0
Perfetto, però nel metodo: onOptionsItemSelected, avevo queste istruzioni

Codice (Java): [Seleziona]
Intent intent = new Intent(this, Risposta.class);
startActivity(intent);
finish();

che non funzionano più, come le devo riscrivere?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #5 il: 09 Settembre 2010, 11:57:17 CEST »
+2
Ovviamente in questo modo:

Codice (Java): [Seleziona]
Intent intent = new Intent(mRootActivity, Risposta.class);
mRootActivity.startActivity(intent);
mRootActivity.finish();

 8-)

Offline roccia80

  • Utente junior
  • **
  • Post: 89
  • Respect: 0
    • Mostra profilo
Re:come fare un unico menu per tutte le activity
« Risposta #6 il: 08 Dicembre 2010, 23:44:55 CET »
0
1) No.
2) Si, è consigliabile.

Lo scheletro è questo:
Codice (Java): [Seleziona]
public class SharedMenuActivity extends Activity {
        private MyMenu mMyMenu;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mMyMenu = new MyMenu(this);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                mMyMenu.onCreateOptionsMenu(menu);
                return super.onCreateOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                mMyMenu.onOptionsItemSelected(item);
                return super.onOptionsItemSelected(item);
        }
}

e
Codice (Java): [Seleziona]
public class MyMenu {
        private Activity mRootActivity;
       
        public MyMenu(Activity rootActivity) {
                mRootActivity = rootActivity;
        }

        public boolean onCreateOptionsMenu(Menu menu) {
                MenuInflater menuInflater = mRootActivity.getMenuInflater();
                menuInflater.inflate(R.menu.sharedmenu, menu);
                return true;
        }

        public boolean onOptionsItemSelected(MenuItem item) {
                switch(item.getItemId()) {
                        // TODO: ...
                }
                return true;
        }
}

Ovviamente puoi attuare mille varianti, tipo creare MyMenu come singleton (cosa che sconsiglio), ma la base è questa!

Anche io ho il problema del menu identico in diverse activity e ho trovato questa discussione molto interessante. Come faccio però a richiamare la classe di menu condiviso all'interno delle mie activity che necessitano di menu?
Grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:come fare un unico menu per tutte le activity
« Risposta #7 il: 09 Dicembre 2010, 00:45:07 CET »
+1
Ma perchè non usare l'ereditarietà creando un'activity base dove implementi il metodo onCreateOptionsMenu e onOptionsItemSelected e fare derivare da quest'ultima tutte le varie activity in cui serve avere un menu comune?
Inoltre è anche la soluzione più flessibile perché se in un'activity devi, ad esempio, aggiungere un pulsante puoi sfruttare il polimorfismo e aggiungerlo senza troppi problemi.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #8 il: 09 Dicembre 2010, 10:53:42 CET »
0
Non sono convinto. Legare degli oggetti per una funzione cosi particolare rischia di abbattere la modularità del progetto.

Preferirei creare una classe ActivityMenu con due metodi onCreateOptionsMenu e onOptionsItemSelected che oltre ai normali parametri accettano magari un parametro supplementare per poter decidere anche il tipo di menu).
Tutte quelle activity che devono usare quel menu possono richiamare quel metodo.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:come fare un unico menu per tutte le activity
« Risposta #9 il: 09 Dicembre 2010, 11:13:33 CET »
0
Non sono convinto. Legare degli oggetti per una funzione cosi particolare rischia di abbattere la modularità del progetto.

Non vedo particolari problemi in questo senso.
Piuttosto, ihmo, l'utilizzo della tua soluzione è poco flessibile, ad esempio, anche nel caso in cui tu debba utilizzare a tutte le activity lo stesso menu ma con comportamenti diversi in ognuna.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #10 il: 09 Dicembre 2010, 11:58:55 CET »
0
Non vedo particolari problemi in questo senso.
Piuttosto, ihmo, l'utilizzo della tua soluzione è poco flessibile, ad esempio, anche nel caso in cui tu debba utilizzare a tutte le activity lo stesso menu ma con comportamenti diversi in ognuna.

In questo caso avresti lo stesso problema con la tua soluzione e anche la risoluzione è simile! ;)
Nel tuo caso ti basta fare l'overrride del metodo onOptionsItemSelected personalizzandolo, nel mio caso, basta non richiamare il metodo della ActivityMenu.

Il fatto di legare degli oggetti a funzionalità estremamente particolari a me non piace molto, solo questo...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:come fare un unico menu per tutte le activity
« Risposta #11 il: 09 Dicembre 2010, 12:24:40 CET »
0
In questo caso avresti lo stesso problema con la tua soluzione e anche la risoluzione è simile! ;)
Nel tuo caso ti basta fare l'overrride del metodo onOptionsItemSelected personalizzandolo, nel mio caso, basta non richiamare il metodo della ActivityMenu.

Il fatto di legare degli oggetti a funzionalità estremamente particolari a me non piace molto, solo questo...

Beh però nel mio caso tu hai, ad esempio, le costanti che rappresentano gli id dei bottoni nella classe, con la tua soluzione li hai in un'altra classe. O sbaglio? 

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:come fare un unico menu per tutte le activity
« Risposta #12 il: 09 Dicembre 2010, 12:41:30 CET »
0
Non ti seguo... per id intendi il MenuItem.getItemId() del onMenuItemSelected?

In questo caso, gli id del menu sono salvati nella classe statica R a cui ha accesso anche l'altra classe.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:come fare un unico menu per tutte le activity
« Risposta #13 il: 09 Dicembre 2010, 12:52:02 CET »
0
In questo caso, gli id del menu sono salvati nella classe statica R a cui ha accesso anche l'altra classe.

Si hai ragione, avevo in mente lo scenario in cui crei il menu da codice e non da xml quindi gli id gli dai tu a mano.

BTW, la mia soluzione lavora a livello di classe la tua a livello di oggetti potremmo fare un'analisi più approfondita per valutarne pregi e difetti ma secondo e andrebbe soprattutto valutato in contesto generale in cui applicarle, come in generale per ogni design pattern.