web-dev-qa-db-ja.com

Androidスピナー:選択したアイテムの変更イベントを入手する

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

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

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
359
Soni Ali

前の答えのいくつかは正しくありません。それらは他のウィジェットやビューでも動作しますが、 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()メソッド呼び出し内に置くことを検討できます。

752
znq
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つ覚えておいてください。

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

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

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

51
Santhosh

あなたのActivityに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("");
}
16
Dhasneem

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がオブジェクトスコープ内にある必要があります。

15
Sampath

Spinner-widgetのドキュメントには、「スピナーはアイテムのクリックイベントをサポートしていません」と書かれています。あなたはあなたの問題を処理するために "setOnItemSelectedListener"を使うべきです

7
johndotnet

あなたのスピナーの名前と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
    }
});
6
droidster.me

OnCreateまたはonStartでOnItemSelectedListenerを設定するかどうかは関係ありません - アクティビティの作成時または起動時にそれぞれ呼び出されます。
したがって、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;
            }
        });
5
Leo Droidcoder
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);
5
Chiwai Chan

真のonChangedListener()が必要な場合ハンドラーに初期値を保管して、それが変更されたかどうかを確認してください。それは簡単で、notはグローバル変数を必要とします。ページに複数のスピナーがある場合に機能します。

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

オブジェクトはあなたの友達です、それらを使ってください。

4
fishjd

現在選択されているスピナーにグローバル変数を取ります。

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  Android:id="@+id/spinner_item_text"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" 
Android:layout_height="wrap_content"
Android:background="@drawable/border_close_profile"
Android:gravity="start"  
Android:textColor="@color/black"         
Android:paddingLeft="5dip"
Android:paddingStart="5dip"
Android:paddingTop="12dip"
Android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item>
   <shape Android:shape="rectangle">
    <solid Android:color="#e2e3d7" />
   </shape>
 </item>
<item Android:left="1dp"
Android:right="1dp"
Android:top="1dp"
Android:bottom="1dp">
<shape Android:shape="rectangle">
    <solid Android:color="@color/white_text" />
</shape>
</item>
</layer-list>
3
indrajeet
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
            }
        );
3
kaub0st3r

Flagitemselected = 0を持つことが最も良い方法だと思います。汚れたそして、item selectedイベントでそのフラグをインクリメントします。すなわちflagitemselected ++です。そして(flagitemselected!= 1){//ここであなたの仕事をしてください}かどうかをチェックしてください。

1
Pinakin

これはスピナーとfindviewbyidを初期化し、これを使うことでうまくいくでしょう。

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

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

    });
1
sanjay

Stefan Klumppによる上記の素晴らしいことも、私に大いに役立ちました。ありがとうございました。私は初心者で、その中の "@Override"は "同じ名前のスーパークラスメソッドをオーバーライドしなければならない"というエラーを引き起こしました。 Eclipseは、オーバーライドを削除することを提案しました。私がこれをしたとき、それは働いた。どうして、どうして私に聞いてはいけません。

1
user241569

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

私はAndroidがメッセージベースの処理システムを使っているのではないかと考えています、そしてそれをすべてonCreateに入れると、描画後にスピナーが生成されるような状況に遭遇するかもしれません。そのため、アイテムの場所を設定した後、リスナーは発砲します。これは当然のことですが、これについては遠慮なく訂正してください。

0
Joe Plante