Androidスピナー:を選択された項目の変更イベント
-
20-09-2019 - |
質問
どのようにすることができます設定のイベントリスナーのためのスピナーが選択された項目。
基本的にはうっていうこと:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
解決
そのため、回答が正しくありません。働いている他のウィジェットとの見解がありますが、ドキュメンテーションには、 スピンナーウィジェット 明示:
スピナーはサポートしない項目をクリック イベント。このメソッドを呼び出すことを ます。
より良い活用 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;
}
});
注記: 一つ覚えておいてください。
スピナー OnItemSelectedListener
イベントは 2 回実行されます。
- スピナーの初期化
- ユーザーが手動で選択
flag 変数を使用して、これら 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
これが機能するにはオブジェクトスコープ内にある必要があります。
あなたのスピナーの名前を見つけ、このメソッドを実装し、その後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
}
});
スピナーウィジェットのドキュメントは言う。
スピナーは、アイテムのクリックイベントをサポートしていません。
あなたはあなたの問題を処理するためにsetOnItemSelectedListener
を使用する必要があります。
-
それはあなたがのonCreateやONSTARTにOnItemSelectedListenerを設定します重要ではありません。
だから我々は(ONSTARTにとNOT!)のonCreateでそれを設定することができます。
ただ、最初の初期化を把握するためにフラグを追加します:
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をしたい場合は()。ハンドラ内で初期値を保存し、それが変更されているかどうかを確認します。それは簡単で、 のないグローバル変数を必要としません。ページ上に複数のスピナーを持っている場合は動作します。
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
}
);
スピナーの現在の選択のためのグローバル変数を取ります:
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>
これは動作します スピナーとfindviewbyidをintializeし、それが動作しますこれを使用する
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
}
});
私はflagitemselected = 0;
でonCreate()
を持っているだろう何を考えて最善の方法。そして、そのフラグすなわちのflagitemselected++
項目選択したイベントの増分で、その後、チェック
if(flagitemselected!=1)
{
// do your work here
}
これは私が推測するのに役立ちます。
私が見つけた1つのトリックは代わりのonCreateのonWindowFocusChangedであなたのsetOnItemSelectedListenersを入れていました。私はまだ、それをこのように行うのいずれかの悪い副作用を発見していません。窓が描か取得した後、基本的には、リスナーを設定します。私は実行をonWindowFocusChanged頻度わからないんだけど、それはあなたがあまりにも頻繁に実行されていることを見つけている場合は、自分でロック変数を作成することは簡単です。
私は、Androidは、メッセージ・ベースの処理システムを使用しているかもしれないと思うと、あなたがのonCreateでそれをすべて置く場合、あなたはそれが描かれます後、スピナーが読み込まれますような状況に遭遇することがあります。アイテムの場所を設定した後、だから、あなたのリスナーがオフに発生します。これはもちろん、推測ですが、この上で私を修正すること自由に感じています。