Xamarin.Android Spinner

Spinner は、項目を選択するためのドロップダウン リストを表示するウィジェットです。 このガイドでは、スピナーに選択肢のリストを表示し、その後、選択した選択肢に関連付けられた他の値を表示する変更を行う単純なアプリを作成する方法について説明します。

基本的なスピナー

このチュートリアルの最初の部分では、惑星のリストを表示する単純なスピナー ウィジェットを作成します。 惑星を選択すると、選択した項目がトースト メッセージに表示されます。

Example screenshots of HelloSpinner app

HelloSpinner という名前の新しいプロジェクトを開始します。

Resources/Layout/Main.axml を開き、次の XML を挿入します。

<?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>

TextViewandroid:text 属性と Spinnerandroid:prompt 属性はどちらも同じ文字列リソースを参照していることに注意してください。 このテキストは、ウィジェットのタイトルとして動作します。 Spinner に適用すると、ウィジェットを選択したときに表示される選択ダイアログにタイトル テキストが表示されます。

Resources/Values/Strings.xml を編集し、次のようにファイルを変更します。

<?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>

2 番目の <string> 要素は、上記のレイアウトの TextViewSpinner によって参照されるタイトル文字列を定義します。 <string-array> 要素は、Spinner ウィジェットにリストとして表示される文字列のリストを定義します。

MainActivity.cs を開いて、次の using ステートメントを追加します。

using System;

次に、OnCreate() メソッドに対して次のコードを挿入します。

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;
}

Main.axml レイアウトがコンテンツ ビューとして設定されると、FindViewById<>(int) を使用して Spinner ウィジェットがレイアウトからキャプチャされます。 .次に、CreateFromResource() メソッドは新しい ArrayAdapter を作成し、文字列配列内の各項目を Spinner の初期の外観 (各項目が選択されたときにスピナーに表示される状態) にバインドします。 Resource.Array.planets_array ID は上で定義した string-array を参照し、Android.Resource.Layout.SimpleSpinnerItem ID はプラットフォームによって定義された標準スピナーの外観のレイアウトを参照します。 SetDropDownViewResource は、ウィジェットを開いたときの各項目の外観を定義するために呼び出されます。 最後に、Adapter プロパティを設定すると、ArrayAdapter のすべての項目が Spinner に関連付けられるように設定されます。

次に、Spinner から項目が選択されたときにアプリケーションに通知するコールバック メソッドを指定します。 このメソッドは次のようになります。

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 ();
}

項目を選択すると、送信者は Spinner にキャストされ、その項目にアクセスできるようになります。 ItemEventArgsPosition プロパティを使用すると、選択したオブジェクトのテキストを見つけて、それを使用して Toast を表示できます。

アプリケーションを実行すると、次のようになるはずです。

Screenshot example of Spinner with Mars selected as the planet

キーと値のペアを使用したスピナー

多くの場合、アプリで使用されるある種のデータに関連付けられたキー値を表示するには、Spinner を使用する必要があります。 Spinner はキーと値のペアを直接操作しないため、キーと値のペアを個別に保存し、Spinner にキー値を設定してから、そのスピナーで選択したキーの位置を使用して関連付けられているデータ値を検索する必要があります。

次の手順では、選択した惑星の平均気温を表示するように HelloSpinner アプリを変更します。

次の using ステートメントを MainActivity.cs に追加します。

using System.Collections.Generic;

MainActivity クラスに次のインスタンス変数を追加します。 このリストには、惑星とその平均気温のキーと値のペアが保持されます。

private List<KeyValuePair<string, string>> planets;

OnCreate メソッドで、adapter が宣言される前に次のコードを追加します。

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")
};

このコードは、惑星とそれに関連付けられた平均気温の単純なストアを作成します (実際のアプリでは、通常、データベースはキーとそれに関連付けられたデータを保存するために使用されます)。

上記のコードの直後に、次の行を追加してキーを抽出し、(順番に) リストに配置します。

List<string> planetNames = new List<string>();
foreach (var item in planets)
    planetNames.Add (item.Key);

このリストを (planets_array リソースの代わりに) ArrayAdapter コンストラクターに渡します。

var adapter = new ArrayAdapter<string>(this,
    Android.Resource.Layout.SimpleSpinnerItem, planetNames);

選択した位置を使用して、選択した惑星に関連付けられた値 (気温) を検索するように、spinner_ItemSelected を変更します。

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();
}

アプリケーションを実行します。トーストは次のようになります。

Example of planet selection displaying temperature

リソース

"このページの一部は、Android オープンソース プロジェクトによって作成および共有された作業生産物に基づいて変更されており、Creative Commons 2.5 Attribution License に記載されている条件に従って使用されます。"