選択したアイテムが変更されたときにスピナーのイベントリスナーを設定するにはどうすればよいですか?
基本的に私がやろうとしていることは、これに似たものです:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
選択したアイテムが変更されたときにスピナーのイベントリスナーを設定するにはどうすればよいですか?
基本的に私がやろうとしていることは、これに似たものです:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
以前の回答の一部は正しくありません。これらは他のウィジェットやビューでも機能しますが、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()
メソッド呼び出し内に配置することを検討できます。
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 回実行されます。
フラグ変数を使用して、これら 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
、これが機能するためには、オブジェクト スコープ内にある必要があります。
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;
}
});
スピナー名と 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
}
});
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
}
);
私が思う最善の方法はflagitemselected = 0;
、onCreate()
. そして、アイテムが選択されたイベントでは、そのフラグが増加しますflagitemselected++
。そしてチェック
if(flagitemselected!=1)
{
// do your work here
}
これは私が推測するのに役立ちます。
私が見つけた 1 つのトリックは、onCreate ではなく onWindowFocusChanged に setOnItemSelectedListeners を配置することでした。この方法で行うことによる悪い副作用はまだ見つかっていません。基本的に、ウィンドウが描画された後にリスナーを設定します。onWindowFocusChanged がどのくらいの頻度で実行されるかはわかりませんが、実行頻度が高すぎる場合は、自分でロック変数を作成するのは簡単です。
Android はメッセージ ベースの処理システムを使用している可能性があり、それをすべて onCreate に入れると、スピナーが描画された後に値が設定される状況に遭遇する可能性があります。したがって、アイテムの場所を設定すると、リスナーが起動します。もちろん、これは経験に基づいた推測ですが、これについては自由に修正してください。