Xamarin.Android Spinner
Spinner
è un widget che presenta un elenco a discesa per la selezione di elementi. Questa guida illustra come creare una semplice app che visualizza un elenco di scelte in una selezione, seguita da modifiche che visualizzano altri valori associati alla scelta selezionata.
Spinner di base
Nella prima parte di questa esercitazione si creerà un semplice widget di selezione che visualizza un elenco di pianeti. Quando si seleziona un pianeta, viene visualizzato un messaggio di tipo avviso popup:
Avviare un nuovo progetto denominato HelloSpinner.
Aprire Resources/Layout/Main.axml e inserire il codice XML seguente:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:text="@string/planet_prompt"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/planet_prompt"
/>
</LinearLayout>
Si noti che l'attributo TextView
e android:text
l'attributo Spinner
dell'oggetto android:prompt
fanno riferimento alla stessa risorsa stringa. Questo testo si comporta come titolo per il widget. Se applicato a , il testo del Spinner
titolo verrà visualizzato nella finestra di dialogo di selezione visualizzata quando si seleziona il widget.
Modificare Risorse/Valori/Strings.xml e modificare il file in modo che sia simile al seguente:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloSpinner</string>
<string name="planet_prompt">Choose a planet</string>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
Il secondo <string>
elemento definisce la stringa del titolo a cui fa TextView
riferimento e Spinner
nel layout precedente.
L'elemento <string-array>
definisce l'elenco di stringhe che verranno visualizzate come elenco nel Spinner
widget.
Aprire ora MainActivity.cs e aggiungere l'istruzione seguenteusing
:
using System;
Inserire quindi il codice seguente per il OnCreate()
metodo ) :
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "Main" layout resource
SetContentView (Resource.Layout.Main);
Spinner spinner = FindViewById<Spinner> (Resource.Id.spinner);
spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs> (spinner_ItemSelected);
var adapter = ArrayAdapter.CreateFromResource (
this, Resource.Array.planets_array, Android.Resource.Layout.SimpleSpinnerItem);
adapter.SetDropDownViewResource (Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner.Adapter = adapter;
}
Dopo aver impostato il Main.axml
layout come visualizzazione contenuto, il Spinner
widget viene acquisito dal layout con FindViewById<>(int)
.
La CreateFromResource()
il metodo crea quindi un nuovo ArrayAdapter
oggetto , che associa ogni elemento nella matrice di stringhe all'aspetto iniziale di Spinner
, ovvero il modo in cui ogni elemento verrà visualizzato nella selezione quando selezionato. L'ID Resource.Array.planets_array
fa riferimento all'ID string-array
definito in precedenza e l'ID Android.Resource.Layout.SimpleSpinnerItem
fa riferimento a un layout per l'aspetto standard della selezione, definito dalla piattaforma.
SetDropDownViewResource
viene chiamato per definire l'aspetto per ogni elemento all'apertura del widget. Infine, l'oggetto ArrayAdapter
è impostato per associare tutti i relativi elementi all'oggetto Spinner
impostando la Adapter
proprietà .
Fornire ora un metodo di callback che invia una notifica all'applicazione quando è stato selezionato un elemento da Spinner
. Ecco l'aspetto di questo metodo:
private void spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
{
Spinner spinner = (Spinner)sender;
string toast = string.Format ("The planet is {0}", spinner.GetItemAtPosition (e.Position));
Toast.MakeText (this, toast, ToastLength.Long).Show ();
}
Quando viene selezionato un elemento, viene eseguito il cast del mittente a un oggetto Spinner
in modo che sia possibile accedere agli elementi. Usando la Position
proprietà in ItemEventArgs
, è possibile trovare il testo dell'oggetto selezionato e usarlo per visualizzare un oggetto Toast
.
Eseguire l'applicazione; dovrebbe essere simile al seguente:
Selezione tramite coppie chiave/valore
Spesso è necessario usare Spinner
per visualizzare i valori chiave associati a alcuni tipi di dati usati dall'app. Poiché Spinner
non funziona direttamente con coppie chiave/valore, è necessario archiviare Spinner
separatamente la coppia chiave/valore, popolare con i valori chiave, quindi usare la posizione della chiave selezionata in Spinner per cercare il valore di dati associato.
Nei passaggi seguenti, l'app HelloSpinner viene modificata per visualizzare la temperatura media per il pianeta selezionato:
Aggiungere l'istruzione seguente using
a MainActivity.cs:
using System.Collections.Generic;
Aggiungere la variabile di istanza seguente alla MainActivity
classe .
Questo elenco conterrà coppie chiave/valore per i pianeti e le relative temperature medie:
private List<KeyValuePair<string, string>> planets;
OnCreate
Nel metodo aggiungere il codice seguente prima adapter
di essere dichiarato:
planets = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Mercury", "167 degrees C"),
new KeyValuePair<string, string>("Venus", "464 degrees C"),
new KeyValuePair<string, string>("Earth", "15 degrees C"),
new KeyValuePair<string, string>("Mars", "-65 degrees C"),
new KeyValuePair<string, string>("Jupiter" , "-110 degrees C"),
new KeyValuePair<string, string>("Saturn", "-140 degrees C"),
new KeyValuePair<string, string>("Uranus", "-195 degrees C"),
new KeyValuePair<string, string>("Neptune", "-200 degrees C")
};
Questo codice crea un archivio semplice per i pianeti e le temperature medie associate. In un'app reale un database viene in genere usato per archiviare le chiavi e i relativi dati associati.
Subito dopo il codice precedente, aggiungere le righe seguenti per estrarre le chiavi e inserirle in un elenco (in ordine):
List<string> planetNames = new List<string>();
foreach (var item in planets)
planetNames.Add (item.Key);
Passare questo elenco al ArrayAdapter
costruttore (anziché alla planets_array
risorsa):
var adapter = new ArrayAdapter<string>(this,
Android.Resource.Layout.SimpleSpinnerItem, planetNames);
Modificare spinner_ItemSelected
in modo che la posizione selezionata venga usata per cercare il valore (la temperatura) associato al pianeta selezionato:
private void spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
Spinner spinner = (Spinner)sender;
string toast = string.Format("The mean temperature for planet {0} is {1}",
spinner.GetItemAtPosition(e.Position), planets[e.Position].Value);
Toast.MakeText(this, toast, ToastLength.Long).Show();
}
Eseguire l'applicazione; L'avviso popup dovrebbe essere simile al seguente:
Risorse
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nellalicenza Creative Commons 2.5 Attribuzione.