Android Spinner: получить выбранное событие изменения элемента
Как вы можете установить прослушиватель событий для Spinner при изменении выбранного элемента?
в основном то, что я пытаюсь сделать, похоже на это:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
14 ответов
некоторые из предыдущих ответов неверны. Они работают для других виджетов и представлений, но документация для Spinner widget четко указано:
счетчик не поддерживает щелчок элемента события. Вызов этого метода вызовет исключение.
лучше использовать 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;
}
});
Примечание: запомни одну вещь.
Spinner OnItemSelectedListener
событие будет выполняться дважды:
- инициализация Spinner
- пользователь выбрал вручную
попробуйте дифференцировать эти два, используя переменную флага.
вы можете реализовать 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
должно быть в области объекта, чтобы это работало!
в документах для spinner-widget говорится: "spinner не поддерживает события щелчка элемента." Вы должны использовать "setOnItemSelectedListener" для обработки вашей проблемы
spinner1.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
//add some code here
}
);
найдите свое имя spinner и найдите 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:
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>
неважно, будете ли вы устанавливать 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;
}
});
Если вы хотите true 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
}
);
блестящий выше Стефан Klumpp также помог мне много. Спасибо. Я новичок, и "@ Override "в нем вызвал ошибку" должен переопределить метод суперкласса с тем же именем". Eclipse предложил мне удалить переопределения. Когда я это сделал, это сработало. Пожалуйста, не спрашивайте меня, как и почему.
лучшим способом, который я думаю, было бы иметь flagitemselected=0; в oncreate. И на элементе выбранного события увеличьте этот флаг i.e flagitemselected++; а затем проверьте, если (flagitemselected!=1) {//do your work here}.Это поможет мне угадать
один трюк, который я нашел, это поместить ваши setOnItemSelectedListeners в onWindowFocusChanged вместо onCreate. Я пока не нашел никаких побочных эффектов, чтобы сделать это таким образом. В основном, настраивают слушателей после окне перерисовывалась. Я не уверен, как часто выполняется onWindowFocusChanged, но достаточно легко создать переменную блокировки, если вы обнаружите, что она работает слишком часто.
Я думаю, что Android может использовать систему обработки сообщений, и если вы поместите все это в onCreate, вы можете столкнуться с ситуациями, когда счетчик заполняется после его рисования. Таким образом, ваш слушатель выстрелит после того, как вы установите местоположение элемента. Это, конечно, обоснованная догадка, но не стесняйтесь поправлять меня в этом.