439

選択したアイテムが変更されたときにスピナーのイベントリスナーを設定するにはどうすればよいですか?

基本的に私がやろうとしていることは、これに似たものです:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
4

17 に答える 17

884

以前の回答の一部は正しくありません。これらは他のウィジェットやビューでも機能しますが、Spinner ウィジェットのドキュメントには次のように明確に記載されています。

スピナーはアイテム クリック イベントをサポートしていません。このメソッドを呼び出すと、例外が発生します。

代わりにOnItemSelectedListener()を使用することをお勧めします。

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

これは私にとってはうまくいきます。

ビューの構築時に onItemSelected メソッドも呼び出されることに注意してください。そのため、onCreate()メソッド呼び出し内に配置することを検討できます。

于 2009-11-11T10:50:26.063 に答える
60
Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

注: 1 つのことを覚えておいてください。

SpinnerOnItemSelectedListenerイベントは 2 回実行されます。

  1. スピナーの初期化
  2. ユーザーが手動で選択

フラグ変数を使用して、これら 2 つを区別してみてください。

于 2010-04-29T05:15:50.893 に答える
24

AdapterView.OnItemSelectedListenerアクティビティにクラスを実装できます。

そして、以下の行を使用しますonCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

次に、これら 2 つのメソッドをオーバーライドします。

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}
于 2013-03-27T11:15:19.313 に答える
20

https://stackoverflow.com/q/1714426/811625

簡単なチェックで OnItemSelectedListener() の呼び出しを回避できます。現在の選択インデックスを整数変数に格納し、何かを行う前に onItemSelected(..) 内でチェックします。

例えば:

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

当然iCurrentSelection、これが機能するためには、オブジェクト スコープ内にある必要があります。

于 2011-11-24T15:20:41.697 に答える
12

onCreate または onStart で OnItemSelectedListener を設定しても問題ありません。Activity の作成時または開始時に (それぞれ) 呼び出されます。
そのため、onCreate で設定できます (onStart では設定できません!)。
最初の初期化を把握するためのフラグを追加するだけです:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

次にonCreate(またはonCreateView)で:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });
于 2016-08-23T13:02:19.557 に答える
12

スピナー名と ID を見つけてから、このメソッドを実装します。

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});
于 2012-12-10T05:41:49.980 に答える
3
spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );
于 2013-11-11T16:07:53.520 に答える
1

私が思う最善の方法はflagitemselected = 0;onCreate(). そして、アイテムが選択されたイベントでは、そのフラグが増加しますflagitemselected++。そしてチェック

if(flagitemselected!=1)
{
// do your work here
}

これは私が推測するのに役立ちます。

于 2012-03-16T07:50:43.277 に答える
0

私が見つけた 1 つのトリックは、onCreate ではなく onWindowFocusChanged に setOnItemSelectedListeners を配置することでした。この方法で行うことによる悪い副作用はまだ見つかっていません。基本的に、ウィンドウが描画された後にリスナーを設定します。onWindowFocusChanged がどのくらいの頻度で実行されるかはわかりませんが、実行頻度が高すぎる場合は、自分でロック変数を作成するのは簡単です。

Android はメッセージ ベースの処理システムを使用している可能性があり、それをすべて onCreate に入れると、スピナーが描画された後に値が設定される状況に遭遇する可能性があります。したがって、アイテムの場所を設定すると、リスナーが起動します。もちろん、これは経験に基づいた推測ですが、これについては自由に修正してください。

于 2012-08-10T18:36:58.043 に答える