OnItemSelectedListener вызывается при повороте экрана - PullRequest
1 голос
/ 20 ноября 2010

Когда я меняю ориентацию моего экрана в Android, вызывается OnItemSelectedListener из Spinner.

Это не просто эмулятор, это также происходит на физическом телефоне.

Как я могу остановить это?

Приветствие.

Ответы [ 3 ]

4 голосов
/ 26 сентября 2014

Вы также получите второй вызов, если Spinner selectedItemPosition не равен нулю при повороте экрана, так как Android устанавливает положение на то, что было до поворота. Используйте onSaveInstanceState для подсчета количества счетчиков в ненулевой позиции и используйте этот счетчик так, чтобы код OnItemSelected просто возвращался до тех пор, пока счетчик не был уменьшен до нуля.

Вы также должны быть чрезвычайно осторожны с блеснами, которые могут иметь видимость View.GONE. Я добавлю сюда еще немного текста, когда смогу найти время, чтобы точно описать, как с ними обращаться.

2 голосов
/ 20 ноября 2010

Счетчики всегда выбраны.Ваш OnItemSelectedListener будет вызываться при любых изменениях состояния Spinner, в том числе при первой настройке Spinner.Нормальное изменение ориентации приведет к тому, что ваша деятельность будет уничтожена и воссоздана.Итак, если ваш OnItemSelectedListener вызывается, когда ваша активность впервые появляется на экране, она будет вызываться снова при изменении ориентации.

Как я могу остановить это?

Возможно, вы сможете поэкспериментировать со временем, когда вы звоните setOnItemSelectedListener() по сравнению с setAdapter(), чтобы посмотреть, поможет ли это.

1 голос
/ 30 апреля 2018

OnItemSelectedListener вызывается до того, как счетчик содержит свой адаптер, поэтому необходимо проверить, что представление не является нулевым внутри метода OnItemSelected, например:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
  @Override public void onItemSelected (AdapterView<?> parent, View view, int position, long id){
    if(view != null) { // <- here is the validation
      // Your code to do something with the selected item
    }
  }
  @Override public void onNothingSelected(AdapterView<?> parent) { }
});
...