選択したアイテムが変更されたときにSpinnerのイベントリスナーをどのように設定できますか?
基本的に私がやろうとしているのはこれに似たものです:
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つ覚えておいてください。
Spinner OnItemSelectedListener
イベントは2回実行されます。
Flag変数を使用して、これら2つを区別してみてください。
あなたの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("");
}
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
がオブジェクトスコープ内にある必要があります。
Spinner-widgetのドキュメントには、「スピナーはアイテムのクリックイベントをサポートしていません」と書かれています。あなたはあなたの問題を処理するために "setOnItemSelectedListener"を使うべきです
あなたのスピナーの名前と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
}
});
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;
}
});
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
真の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;
}
}
オブジェクトはあなたの友達です、それらを使ってください。
現在選択されているスピナーにグローバル変数を取ります。
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>
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を持つことが最も良い方法だと思います。汚れたそして、item selectedイベントでそのフラグをインクリメントします。すなわちflagitemselected ++です。そして(flagitemselected!= 1){//ここであなたの仕事をしてください}かどうかをチェックしてください。
これはスピナーと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
}
});
Stefan Klumppによる上記の素晴らしいことも、私に大いに役立ちました。ありがとうございました。私は初心者で、その中の "@Override"は "同じ名前のスーパークラスメソッドをオーバーライドしなければならない"というエラーを引き起こしました。 Eclipseは、オーバーライドを削除することを提案しました。私がこれをしたとき、それは働いた。どうして、どうして私に聞いてはいけません。
私が見つけた1つのトリックは、onCreateではなくonWindowFocusChangedにsetOnItemSelectedListenerを入れることでした。私はまだこの方法でそれをすることへの悪い副作用を見つけていません。基本的に、ウィンドウが描画されたらリスナーを設定します。 onWindowFocusChangedの実行頻度がよくわかりませんが、頻繁に実行されていることが判明した場合は、自分でロック変数を作成するのが簡単です。
私はAndroidがメッセージベースの処理システムを使っているのではないかと考えています、そしてそれをすべてonCreateに入れると、描画後にスピナーが生成されるような状況に遭遇するかもしれません。そのため、アイテムの場所を設定した後、リスナーは発砲します。これは当然のことですが、これについては遠慮なく訂正してください。