답변:
이전 답변 중 일부가 올바르지 않습니다. 다른 위젯과 뷰에서 작동하지만 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;
}
});
참고 : 한 가지만 기억하십시오.
스피너 OnItemSelectedListener
이벤트는 두 번 실행됩니다.
플래그 변수를 사용하여이 두 가지를 구별하십시오.
AdapterView.OnItemSelectedListener
활동에서 클래스를 구현할 수 있습니다 .
그런 다음 아래 줄을 사용하십시오. onCreate()
Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
그런 다음이 두 가지 방법을 재정의하십시오.
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
}
});
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;
}
});
스피너의 현재 선택을 위해 전역 변수를 사용하십시오.
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
}
});
내가 찾은 한 가지 트릭은 setOnItemSelectedListeners를 onCreate 대신 onWindowFocusChanged에 넣는 것입니다. 나는이 방법으로 나쁜 부작용을 발견하지 못했습니다. 기본적으로 윈도우가 그려진 후 리스너를 설정하십시오. onWindowFocusChanged가 얼마나 자주 실행되는지 잘 모르겠지만 너무 자주 실행되는 경우 잠금 변수를 쉽게 만들 수 있습니다.
안드로이드가 메시지 기반 처리 시스템을 사용하고 있다고 생각하고 onCreate에 모두 넣으면 스피너가 그려진 후 스피너가 채워지는 상황이 발생할 수 있습니다. 따라서 항목 위치를 설정하면 청취자가 시작됩니다. 이것은 물론 교육받은 추측이지만이 문제를 자유롭게 고칠 수 있습니다.