回答:
以前の回答のいくつかは正しくありません。他のウィジェットやビューでも機能しますが、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()
メソッド呼び出し内に配置することを検討できます。
onItemSelected(...)
、ヒットされません。(私はこれを難しい方法で見つけたので知っています。)
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つのことを覚えておいてください。
スピナーOnItemSelectedListener
イベントは2回実行されます。
フラグ変数を使用して、これら2つを区別してみてください。
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("");
}
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
これが機能するためには、オブジェクトスコープにある必要があります。
iCurrentSelection
変数がこの匿名クラス内で宣言されている場合、正常に動作します。最初の呼び出しでコードが実行されるように、これを-1に初期化できます。
スピナー名と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
}
});
OnItemSelectedListenerをonCreateまたはonStartに設定するかどうかは関係ありません。アクティビティの作成時または開始時に(それぞれ)呼び出されます。
したがって、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;
}
});
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
スピナーの現在の選択のグローバル変数を取得します。
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>
真のonChangedListener()が必要な場合。ハンドラーに初期値を格納し、変更されたかどうかを確認します。これはシンプルで、グローバル変数を必要としません。ページに複数のスピナーがある場合に機能します。
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;
}
}
オブジェクトはあなたの友達です、それらを使用してください。
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
}
);
これは、スピナーと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つのトリックは、onCreateではなくonWindowFocusChangedにsetOnItemSelectedListenersを置くことでした。この方法で行うことによる悪影響はまだ見つかっていません。基本的に、ウィンドウが描画された後にリスナーを設定します。onWindowFocusChangedがどのくらいの頻度で実行されるかはわかりませんが、あまりにも頻繁に実行されている場合は、ロック変数を作成するのは簡単です。
Androidはメッセージベースの処理システムを使用していると思います。すべてをonCreateに入れると、スピナーが描画された後にスピナーが実装される状況に遭遇する可能性があります。そのため、アイテムの場所を設定すると、リスナーが起動します。もちろん、これは知識に基づいた推測ですが、これについては自由に修正してください。