goo blog サービス終了のお知らせ 

marunomaruno-memo

marunomaruno-memo

[Android] フォームの標準ウィジェット(1) 静的な選択関連

2012年02月29日 | Android
[Android] フォームの標準ウィジェット(1) 静的な選択関連
================================================================================

ウィジェットは、ホーム画面に追加される小さな機能。
Android では、標準で、いくつかのウィジェットを用意している。これらを使って、デー
タを表示したり、入力したり、選択したりすることができる。

選択する以下の ウィジェット(Widget)とそのイベント処理。
    ・ボタン
    ・チェックボックス
    ・トグルボタン
    ・ラジオボタン
    ・スピナー
    ・シークバー(別記)
    ・レーティングバー(別記)

上記のウィジェットは、それぞれつぎのクラスを使う。また、そのときに使われるリス
ナー・インターフェースも示す。

------------------ -------------- ----------------------------------------------
ウィジェット       クラス         リスナー・インターフェース
------------------ -------------- ----------------------------------------------
ボタン             Button         View.OnClickListener, View.OnLongClickListener
                                  View.OnTouchListener
チェックボックス   CheckBox       CompoundButton.OnCheckedChangeListener
                                  View.OnClickListener, View.OnLongClickListener
                                  View.OnTouchListener
トグルボタン       ToggleButton   CompoundButton.OnCheckedChangeListener
                                  View.OnClickListener, View.OnLongClickListener
                                  View.OnTouchListener
ラジオボタン       RadioGroup     RadioGroup.OnCheckedChangeListener
                   RadioButton
スピナー           Spinner        AdapterView.OnItemSelectedListener
                                  View.OnTouchListener
シークバー         SeekBar        SeekBar.OnSeekBarChangeListener
                                  View.OnTouchListener
レーティングバー   RatingBar      RatingBar.OnRatingBarChangeListener
                                  View.OnTouchListener
------------------ -------------- ----------------------------------------------

このサンプルは、アプリケーションの起動時に選択する値が決まっているパターンを示す。


▲ レイアウト

□ res/layout/main.xml
---
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- (1) ボタン -->
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <!-- (2) チェックボックス -->
    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CheckBox" />

    <!-- (3) トグルボタン -->
    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:text="ToggleButton" />

    <!-- (4) ラジオボタン -->
    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="@string/listItem0" />    <!-- (5) -->

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/listItem1" />

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/listItem2" />
    </RadioGroup>

    <!-- (6) スピナー -->
    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/list1" />

</LinearLayout>
---

(1) ボタン

クリックする、を実現している基本的なユーザー・インターフェースになっているビュー。
クリック時、長いクリック(長押し)時の処理をハンドラーとしてプログラムする。また、
タッチ時の処理もハンドリングできる。

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />


ボタンに限らず、GUI 部品の属性には、android:onClick 属性があり、クリックされたと
きに動くハンドラー・メソッドを指定することができる。
今回は、リスナー・クラスを用意して、それぞれの部品の setOnXxxListener() メソッド
でリスナーを登録するので、ここでは指定はしていない。


(2) チェックボックス

チェックしている状態とチェックしていない状態の 2 つの状態を持つビュー。
チェックボックスをクリックするたびに、この 2 つの状態が入れ替わる。

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CheckBox" />

android:checked 属性が "true" のとき、最初からチェックがついている状態になる。


(3) トグルボタン

トグルボタンは、クリックするたびに状態が OFF/ON を繰り返す種類のボタンである。

    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:text="ToggleButton" />

android:checked 属性が "true" のとき、最初から ON の状態になる。

android:text 要素に値を設定しても表示としては変わらない。表示の文字列をデフォル
トの「OFF」「ON」から変更するには、android:textOff 属性と、android:textOn 属性を
使う。


 (4)(5) ラジオボタン

チェックボックスのように、チェックしている状態とチェックしていない状態の 2 つの
状態を持つビュー。
ただし、グループ化することで、そのグループの中ではひとつだけがチェックしている状
態になる。
同じグループは、RadioGroup 要素で囲む。

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="@string/listItem0" />    <!-- (5) -->

android:checked 属性が "true" の項目があれば、それが最初からチェックがついている
状態になる。


(6) スピナー

選択リスト。複数の項目からひとつを選択できるのは、ラジオボタンと同じ。
アプリ起動時に、このリスナーのハンドラーが動く。

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/list1" />

なにも設定しないと、リストの先頭のものが選択された状態になる。

android:entries 属性に、表示する項目のリストを設定する。
この例のように静的な場合は、リソースの <string-array> 要素で設定している。

※ なお、最初に選択する項目の指定は、プログラムで指定するしかなさそう。
Spinner.setSelection() に相当する XML 属性がない。


▲リソース値

□ res/values/strings.xml
---
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">FormWidgets01</string>
    <string name="listItem0">アイスクリーム</string>
    <string name="listItem1">かりんとう</string>
    <string name="listItem2">さつまいも</string>

    <string-array name="list1">
        <item>@string/listItem0</item>
        <item>@string/listItem1</item>
        <item>@string/listItem2</item>
    </string-array>

</resources>
---

string-array 要素を使って、Spinner で使う項目を設定している。


▲ アクティビティ

単に、Widget にあわせたリスナーを割り当てているだけである。
なお、リスナーはインナー・クラスを使っている。
どのハンドラーが使われたかは、トーストとログで表示している。

□ FormWidgets01Activity.java
package jp.marunomarun.android.formwidgets;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.ToggleButton;

public class FormWidgets01Activity extends Activity {
    private static final int TOAST_DURATION = Toast.LENGTH_SHORT;

    private Context context; // (1)

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = this; // (2)

        // ボタン
        Button button1 = (Button) findViewById(R.id.button1);
        OnCheckAndLongClickListener clickListener = new OnCheckAndLongClickListener();
        OnTouchListener touchListener = new OnTouchListener();
        button1.setOnClickListener(clickListener);
        button1.setOnLongClickListener(clickListener);
        button1.setOnTouchListener(touchListener);

        // チェックボックス
        CheckBox check1 = (CheckBox) findViewById(R.id.checkBox1);
        check1.setOnCheckedChangeListener(new OnCheckCompoundButtonListener());
        check1.setOnClickListener(clickListener);
        check1.setOnLongClickListener(clickListener);
        check1.setOnTouchListener(touchListener);

        // トグルボタン
        ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggleButton1);
        toggle1.setOnCheckedChangeListener(new OnCheckCompoundButtonListener());
        toggle1.setOnClickListener(clickListener);
        toggle1.setOnLongClickListener(clickListener);
        toggle1.setOnTouchListener(touchListener);

        // ラジオボタン
        RadioGroup group1 = (RadioGroup) findViewById(R.id.radioGroup1);
        group1.setOnCheckedChangeListener(new OnCheckRadioGroupListener());
        group1.setOnClickListener(clickListener); // 動かないだけ 
        group1.setOnLongClickListener(clickListener); // 動かないだけ
        group1.setOnTouchListener(touchListener); // 動かないだけ

        // スピナー
        Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner1.setOnItemSelectedListener(new OnItemSelectedSpinnerListener());
        // spinner1.setOnClickListener(listener); // RuntimeException)
        // spinner1.setOnLongClickListener(listener); // RuntimeException
        spinner1.setOnTouchListener(touchListener);
    }

    /**
     * ボタンのクリック、長クリックに対するリスナー
     * 
     * @author marunomaruno
     */
    private class OnCheckAndLongClickListener implements View.OnClickListener,
            View.OnLongClickListener {

        @Override
        public void onClick(View v) {
            String message = String.format(
                    "OnClickListener.onClick() view: %s", v.getTag());
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
        }

        @Override
        public boolean onLongClick(View v) {
            String message = String.format(
                    "OnLongClickListener.onLongClick() view: %s", v.getTag());
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
            return false;
        }
    }

    /**
     * タッチに対するリスナー
     * 
     * @author marunomaruno
     */
    private class OnTouchListener implements View.OnTouchListener {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            String message = String.format(
                    "OnTouchListener.onTouch() view: %s, event: %s",
                    v.getTag(), event);
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
            return false;
        }
    }

    /**
     * チェックボックス、トグルボタンのクリックに対するリスナー
     * 
     * @author marunomaruno
     */
    private class OnCheckCompoundButtonListener implements
            CompoundButton.OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            String message = String.format(
                    "OnCheckedChangeListener.onCheckedChanged(): view: %s, %b",
                    buttonView.getTag(), isChecked);
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
        }
    }

    /**
     * ラジオボタンのクリックに対するリスナー
     * 
     * @author marunomaruno
     */
    private class OnCheckRadioGroupListener implements
            RadioGroup.OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            RadioButton button = (RadioButton) findViewById(checkedId);

            String message = String.format(
                    "OnCheckedChangeListener.onCheckedChanged(): %s", button
                            .getText());
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
        }
    }

    /**
     * スピナーの選択に対するリスナー
     * 
     * @author marunomaruno
     */
    private class OnItemSelectedSpinnerListener implements
            AdapterView.OnItemSelectedListener {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            Spinner spinner = (Spinner) parent;
            String item = (String) spinner.getSelectedItem();

            String message = String
                    .format("OnItemSelectedListener.onItemSelected() parent: 
                                                        %s, view: %s, %d: %s",
                            parent.getTag(), view.getTag(), position, item);
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            String message = String.format(
                    "OnItemSelectedListener.onNothingSelected() parent: %s",
                    parent.getTag());
            System.out.println(message);
            Toast.makeText(context, message, TOAST_DURATION).show();
        }
    }

---

(1)(2) コンテキスト・オブジェクト

内部クラスでトーストを使っているので、このアクティビティ自身(this オブジェクト)
を持っていたほうが都合がよい。

    private Context context;    // (1)
    context = this;    // (2)


(●) ボタン

クリックする、を実現している基本的なユーザー・インターフェースになっているビュー。
クリック、長押し時の処理をハンドラーとしてプログラムする。また、タッチ時の処理も
ハンドリングできる。

    Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnClickListener(clickListener);
    button1.setOnLongClickListener(clickListener);
    button1.setOnTouchListener(touchListener);

クリックは setOnClickListener()、長押しは setOnLongClickListener()、タッチは 
setOnTouchListener() を使ってそれぞれのリスナー・オブジェクトを設定する。

クリックのときは、OnTouchListener.onTouch() の ACTION_DOWN イベント、そして 
ACTION_UP が動く。
この戻り値が false のとき、OnClickListener.onClick()。
まとめると、ACTION_DOWN > ACTION_UP > onClick
---
OnTouchListener.onTouch() view: Button, event: MotionEvent{46c1fc70 action=0 ...}
OnTouchListener.onTouch() view: Button, event: MotionEvent{46c1fc70 action=1 ...}
OnClickListener.onClick() view: Button
---

長押しのときは、クリックに加えて、ACTION_MOVE も動く。
まとめると、ACTION_DOWN > ACTION_MOVE > onLongClick > ACTION_UP > onClick
---
OnTouchListener.onTouch() view: Button, event: MotionEvent{46c1fb60 action=0 ...}
OnTouchListener.onTouch() view: Button, event: MotionEvent{46c1fb60 action=2 ...}
OnLongClickListener.onLongClick() view: Button
OnTouchListener.onTouch() view: Button, event: MotionEvent{46c1fb60 action=1 ...}
OnClickListener.onClick() view: Button
---


△ Button クラス

java.lang.Object 
   +  android.view.View 
     +  android.widget.TextView 
       +  android.widget.Button 

クリックして何らかの動作をさせるためのウィジェット。
Button クラス独自のメソッドはなく、スーパークラスである TextView クラスのメソッ
ドをそのまま利用している。

クリックに関しては、通常のクリックと、長クリック(長押し)の 2 つの種類がある。
---
void     setOnClickListener(View.OnClickListener l)
void     setOnLongClickListener(View.OnLongClickListener l)
void     setOnTouchListener(View.OnTouchListener l)
---
(*1) TextView のメソッド


△ View.OnClickListener インターフェース

android.view.View.OnClickListener

クリックに関するリスナー・インターフェース。
このハンドラー・メソッドの onClick() の指定は、ウィジェット上で頻繁に使うことが
多いので、レイアウトの XML ファイルでも、android:onClick 属性として用意されてい
る。

・メソッド
---
abstract void  onClick(View v)  
---


△ View.OnLongClickListener インターフェース

android.view.View.OnLongClickListener

長押しに関するリスナー・インターフェース。

・メソッド
---
abstract boolean  onLongClick(View v)  
---


(●) チェックボックス

チェックしている状態とチェックしていない状態の 2 つの状態を持つビュー。
チェックボックスをクリックするたびに、この 2 つの状態が入れ替わる。

    CheckBox check1 = (CheckBox) findViewById(R.id.checkBox1);
    check1.setOnCheckedChangeListener(new OnCheckCompoundButtonListener());
    check1.setOnClickListener(clickListener);
    check1.setOnLongClickListener(clickListener);
    check1.setOnTouchListener(touchListener);


クリック時の動き
まとめると、ACTION_DOWN > ACTION_UP > onCheckedChanged > onClick
---
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fc70 action=0 ...}
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fc70 action=1 ...}
OnCheckedChangeListener.onCheckedChanged(): view: CheckBox, false
OnClickListener.onClick() view: CheckBox
---


長押し時の動き
まとめると、ACTION_DOWN > ACTION_MOVE > onLongClick > ACTION_UP > 
                                                    onCheckedChanged > onClick
---
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fb60 action=0 ...]
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fb60 action=2 ...}
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fb60 action=2 ...}
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fb60 action=2 ...}
OnLongClickListener.onLongClick() view: CheckBox
OnTouchListener.onTouch() view: CheckBox, event: MotionEvent{46c1fb60 action=1 ...}
OnCheckedChangeListener.onCheckedChanged(): view: CheckBox, false
OnClickListener.onClick() view: CheckBox
---


△ CheckBox クラス

java.lang.Object 
   +  android.view.View 
     +  android.widget.TextView 
       +  android.widget.Button 
         +  android.widget.CompoundButton 
           +  android.widget.CheckBox 


チェックする・外すことができるウィジェット。

・メソッドなどは、スーパークラスである CompoundButton クラスのメソッドを利用して
いる。CheckBox として使うのは、以下のものが主。
---
boolean  isChecked()
void     setChecked(boolean checked)
void     setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener)
void     toggle()    
---


△ CompoundButton クラス

java.lang.Object 
   +  android.view.View 
     +  android.widget.TextView 
       +  android.widget.Button 
         +  android.widget.CompoundButton 

CheckBox や RadioButton、ToggleButton クラスなどの、ボタンをクリックするとそのボ
タンの状態も変化する種類のクラスのスーパークラス。

サブクラスとして、次のクラスがある。
    CheckBox, 
    RadioButton, 
    Switch, 
    ToggleButton 


・主なメソッド
---
boolean  isChecked()  
void     setButtonDrawable(int resid) 
void     setButtonDrawable(Drawable d) 
void     setChecked(boolean checked) 
void     setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) 
void     toggle()  
---


△ CompoundButton.OnCheckedChangeListener インターフェース

android.widget.CompoundButton.OnCheckedChangeListener

ボタンの状態が変化したときのリスナー・インターフェース。

・メソッド
---
abstract void  onCheckedChanged(CompoundButton buttonView, boolean isChecked)  
---
isChecked:    チェックされていれば true


(●) トグルボタン

トグルボタンは、クリックするたびに状態が OFF/ON を繰り返す種類のボタンである。

    ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggleButton1);
    toggle1.setOnCheckedChangeListener(new OnCheckCompoundButtonListener());
    toggle1.setOnClickListener(clickListener);
    toggle1.setOnLongClickListener(clickListener);
    toggle1.setOnTouchListener(touchListener);


クリック時の動き
まとめると、ACTION_DOWN > ACTION_UP > onCheckedChanged > onClick
---
OnTouchListener.onTouch() view: ToggleButton, event: MotionEvent{46c1fc70 action=0 ...}
OnTouchListener.onTouch() view: ToggleButton, event: MotionEvent{46c1fc70 action=1 ...}
OnCheckedChangeListener.onCheckedChanged(): view: ToggleButton, false
OnClickListener.onClick() view: ToggleButton
---


長押し時の動き
まとめると、ACTION_DOWN > ACTION_MOVE > onLongClick > ACTION_UP > 
                                                    onCheckedChanged > onClick
---
OnTouchListener.onTouch() view: ToggleButton, event: MotionEvent{46c1fb60 action=0 ...}
OnTouchListener.onTouch() view: ToggleButton, event: MotionEvent{46c1fb60 action=2 ...]
OnLongClickListener.onLongClick() view: ToggleButton
OnTouchListener.onTouch() view: ToggleButton, event: MotionEvent{46c1fb60 action=1 ...]
OnCheckedChangeListener.onCheckedChanged(): view: ToggleButton, false
OnClickListener.onClick() view: ToggleButton
---


△ ToggleButton クラス

java.lang.Object 
   +  android.view.View 
     +  android.widget.TextView 
       +  android.widget.Button 
         +  android.widget.CompoundButton 
           +  android.widget.ToggleButton 

トグル・ボタンをあらわすクラス。何も指定しなければ、ボタンに表示されるテキストは
「OFF」と「ON」で、図形としてはライトが消えている状態とついている状態。


・主なメソッド
---
CharSequence  getTextOff() 
CharSequence  getTextOn() 
void  setChecked(boolean checked) 
void  setTextOff(CharSequence textOff) 
void  setTextOn(CharSequence textOn)  
void  setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener)
---


(●) ラジオボタン

チェックボックスのように、チェックしている状態とチェックしていない状態の 2 つの
状態を持つビュー。
ただし、グループ化することで、そのグループの中ではひとつだけがチェックしている状
態になる。
グループ化は RadioGroup クラスを使う。

    RadioGroup group1 = (RadioGroup) findViewById(R.id.radioGroup1);
    group1.setOnCheckedChangeListener(new OnCheckRadioGroupListener());
    group1.setOnClickListener(clickListener); // 動かないだけ 
    group1.setOnLongClickListener(clickListener); // 動かないだけ
    group1.setOnTouchListener(touchListener); // 動かないだけ


選択したときには、とくに OnClickListener.onClick()、OnLongClickListener
.onLongClick()、OnTouchListener.onTouch() が動いていない。これは、RadioGroup で
はなく、RadioButton オブジェクトで設定するもの。

選択時の動き
---
OnCheckedChangeListener.onCheckedChanged(): かりんとう
OnCheckedChangeListener.onCheckedChanged(): さつまいも
---


△ RadioGroup クラス

java.lang.Object 
   +  android.view.View 
     +  android.view.ViewGroup 
       +  android.widget.LinearLayout 
         +  android.widget.RadioGroup 

RadioButton オブジェクトを持つクラス。


・主なメソッド
---
void  check(int id) 
void  clearCheck() 
int   getCheckedRadioButtonId()    チェックされているボタンがなければ -1 が返る
void  setOnCheckedChangeListener(RadioGroup.OnCheckedChangeListener listener)
---


△ RadioButton クラス

java.lang.Object 
   +  android.view.View 
     +  android.widget.TextView 
       +  android.widget.Button 
         +  android.widget.CompoundButton 
           +  android.widget.RadioButton 

個個のラジオボタンを管理するクラス。

・主なメソッド
---
void  toggle()  
---


△ RadioGroup.OnCheckedChangeListener インターフェース

android.widget.RadioGroup.OnCheckedChangeListener

ラジオボタンのチェック状態が変化したときのリスナー。


・メソッド
---
abstract void  onCheckedChanged(RadioGroup group, int checkedId)  
---
checkedId: チェックされた ラジオボタンのリソース ID


(●) スピナー

選択リスト。複数の項目からひとつを選択できるのは、ラジオボタンと同じ。
アプリ起動時に、このリスナーのハンドラーが動く。
---
OnItemSelectedListener.onItemSelected() parent: Spinner, view: null, 0: アイスクリーム
---

    Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
    spinner1.setOnItemSelectedListener(new OnItemSelectedSpinnerListener());
    // spinner1.setOnClickListener(clickListener); // RuntimeException)
    // spinner1.setOnLongClickListener(clickListener); // RuntimeException
    spinner1.setOnTouchListener(touchListener);


上のサンプルコードにあるように、setOnClickListener()、setOnLongClickListener() 
を設定すると、実行時に RuntimeException がスローされる。


選択時の動き
まとめると、ACTION_DOWN > ACTION_UP > onItemSelected
---
OnTouchListener.onTouch() view: Spinner, event: MotionEvent{46c1fc70 action=0 ...}
OnTouchListener.onTouch() view: Spinner, event: MotionEvent{46c41208 action=1 ...}
OnItemSelectedListener.onItemSelected() parent: Spinner, view: null, 1: かりんとう
OnTouchListener.onTouch() view: Spinner, event: MotionEvent{46c41208 action=0 ...}
OnTouchListener.onTouch() view: Spinner, event: MotionEvent{46c41208 action=1 ...}
OnItemSelectedListener.onItemSelected() parent: Spinner, view: null, 2: さつまいも
---


△ Spinner クラス

java.lang.Object 
   +  android.view.View 
     +  android.view.ViewGroup 
       +  android.widget.AdapterView<T extends android.widget.Adapter> 
         +  android.widget.AbsSpinner 
           +  android.widget.Spinner 

選択リストを管理するクラス。


・主なメソッド
---
int     getBaseline() 
CharSequence  getPrompt()  
void    onClick(DialogInterface dialog, int which) 
boolean performClick() 
void    setAdapter(SpinnerAdapter adapter) 
void    setEnabled(boolean enabled) 
void    setGravity(int gravity) 
void    setOnItemClickListener(AdapterView.OnItemClickListener l) 
void    setPrompt(CharSequence prompt) 
void    setPromptId(int promptId) 
---

△ AdapterView クラス

java.lang.Object 
   +  android.view.View 
     +  android.view.ViewGroup 
       +  android.widget.AdapterView<T extends android.widget.Adapter> 

配列やリストからの値を管理できるタイプのビューのスーパークラス。

直接のサブクラスではないが、つぎのクラスがこのクラスを継承している。

GridView
ListView 
Spinner 


・項目選択関係のメソッド
---
Object  getSelectedItem()  
long  getSelectedItemId()  
int  getSelectedItemPosition()  
---

なお、このビューには、setOnClickListener() や setOnLongClickListener() で設定す
るリスナーは設定できない。実行すると、つぎのメッセージの例外がスロー。
    java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView.
 You probably want setOnItemClickListener instead


△ AdapterView.OnItemSelectedListener インターフェース

項目を選択したときのリスナー・インターフェース。
アプリケーション起動時に最初に表示されている項目に対して、まず、このリスナーが動
く。

android.widget.AdapterView.OnItemSelectedListener

・メソッド
---
abstract void  onItemSelected(AdapterView<?> parent, View view, int position, long id) 
abstract void  onNothingSelected(AdapterView<?> parent)  
---

                                                                            以上


最新の画像もっと見る

コメントを投稿