JavascriptProva

mercoledì 27 luglio 2016

Ripasso dei menu per rimaneggiamento dell'interfaccia di FFD

Ora dobbiamo aggiungere i settings.
Devo far entrare in causa le SeekBars.
Sono un po' indeciso se mettere le SeekBars su un'altra activity per evitare che possano essere manomesse distrattamente, e anche per orientare le SeekBars in modalità Landscape consentendo una più fine regolazione dei tempi.
Mi sembra il caso.
Per farlo, devo creare un menu che apra l'attività Impostazioni.
Un'occasione per ripassare i Menu.


Ci sono due eventi, per la gestione dei Menu. Uno è la creazione del Menu e l'altro è la selezione del Menu.

Quindi il primo è onCreateOptionsMenu. Come faccio per ricordare il nome? Ricordando che si tratta di un Menu di opzioni.
Ha come parametro un oggetto menu di tipo Menu.
Quindi chiama la funzione getMenuInflater, che ha come parametro un menu già presente nella cartella menu (o che si può anche creare) che lo inflata e credo inizializzi la variabile menu ad esso.
Restituisce un valore booleano, quindi il metodo è booleano.
Provo a scriverlo.
 @Override
 public boolean onCreateOptionsMenu(Menu menu){
  getMenuInflater().inflate(R.menu.prova, menu);
  return true;
 }
Questa dovrebbe creare il menu. Vediamo quale ne è l'effetto scrivendola su un'attività della mia app...

Mi appaiono i tre puntini, e cliccandoci sopra mi appare un menu con scritto "Settings".
Vediamo la struttura xml del menu contenuto nella cartella...

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.ffd.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>

</menu> 
La scritta "Settings" deve provenire dal file string, contenuto nella cartella values.
Vediamolo...

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">FFD</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="title_activity_form">Form</string>
    <string name="title_activity_prova">Prova</string>

</resources> 
Ecco: la scritta di nome action_settings reca "Settings".
Provo a cambiarla con "Impostazioni" scritto in maiuscolo per vedere se cambia.

PERFETTO!

Ora tolgo questo metodo per vedere se mi spariscono i tre puntini...
Ecco, sì, spariscono.
E se invece faccio dare al metodo un risultato false?
 @Override
 public boolean onCreateOptionsMenu(Menu menu){
  getMenuInflater().inflate(R.menu.main, menu);
  return false;
 }
Ecco, se restituisce false è come se non ci fosse: i tre puntini spariscono.

Ora vediamo il secondo metodo, quello che intercetta la selezione del menu.
Questa volta il centro di tutto non è il Menu ma l'elemento del Menu, ossia l'Item.
Quindi se quello di prima era un OptionsMenu, questo è un OptionsItem.
E quindi il nome del metodo è onOptionsItemSelected. Come parametro abbiamo MenuItem, ossia l'elemento del Menu.
Lo scopo è determinare quale MenuItem è stato selezionato, per cui se ne deve ricavare l'identità, ossia l'Id.
Poi si seleziona: a seconda di quale id corrisponda all'id del MenuItem selezionato si determina la conseguenza e segue la restituzione di true, altrimenti la funzione non termina e si restituisce super.onOptionsItemSelected con item per parametro.
La funzione che restituisce l'id del MenuItem selezionato è getItemId().
Quindi si confronta questo id con l'id del MenuItem scritto nel file xml.

Provo a cancellare e riscrivere...

Okay, sembra che ci sia riuscito piuttosto bene.

Ora scrivo nella mia App anche questa, insieme alla prima.
 @Override
 public boolean onCreateOptionsMenu(Menu menu){
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item){
  int id=item.getItemId();
  if(id==R.id.action_settings){
   Log.d("Menu selezionato", ""+item.getTitle());
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
Vediamo se mi viene scritto in LogCat il nome del MenuItem.

Perfetto!
07-27 13:13:49.361: D/Menu selezionato(25304): IMPOSTAZIONI

Nessun commento:

Posta un commento