Почему мои слушатели счастливы?

Теперь я знаю, что добавление слушателей, а затем установка полей вызовет изменение. Поэтому я устанавливаю свои поля, а затем добавляю слушателей.

Я даже добавил логическое значение, когда оно срабатывало, чтобы избежать этого. Однако после OnResume. Все мои слушатели горят. Может кто-нибудь объяснить, почему и как это остановить. Спасибо.

Вот мой код/рабочий поток:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

   spn1.setSelection(2);
   spn2.setSelection(15); // Gets replaced by the listener to 2, when it shouldnt!

   UseListeners = false; // Ignores fired events with an IF statement.

   addListeners();

   //UseListeners = true;
}

@Override
protected void onResume() {
    super.onResume();   
    UseListeners = true;
}


private void addListeners() {  
    spn1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            try{
                if(UseListeners){                       
                    spn2.setSelection(spn1.getSelectedItemPosition());                      
                }
            } catch (Exception e)
            {
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {            
        }
    }); 
 }

Конечно, после OnResume ничего даже не меняется, поэтому он не должен срабатывать. В резюме буквально просто устанавливается значение true для логического значения. И это последнее состояние перед запуском приложения, поэтому я не уверен, где и почему оно срабатывает. Его Super вызывается до того, как ему также разрешено использовать триггеры.


person IAmGroot    schedule 03.07.2012    source источник
comment
мы можем увидеть остальную часть кода? (задайте поля и добавьте слушателей) по крайней мере 1 пример, чтобы мы могли видеть, что вы делаете.   -  person Th0rndike    schedule 03.07.2012
comment
@ Th0rndike Итак, начнем :) Когда он впервые пытается запуститься (при создании слушателей), он пропускает из-за логического значения. Но затем срабатывает после onResume(); в какой-то момент во время инициализации активности   -  person IAmGroot    schedule 03.07.2012
comment
Они сработают, если вы удалите метод onResume()?   -  person Alexander    schedule 03.07.2012
comment
@ Александр, он же Александр, удаление UseListeners = true;? Неа. Я вижу нужные значения в своих полях. (Прослушиватель срабатывает, но ему не предоставляется разрешение на запуск/изменение чего-либо)   -  person IAmGroot    schedule 03.07.2012
comment
Я имею в виду удаление всего переопределенного метода onResume() из вашего класса, если в этом методе нет ничего значимого.   -  person Alexander    schedule 03.07.2012
comment
Наличие переопределенного класса не вызывает никаких изменений. Первоначально я устанавливал флаг в конце onCreate(). Я переопределяю метод, чтобы убедиться, что ничего не происходит в super.onResume() или между этим и onCreate()   -  person IAmGroot    schedule 03.07.2012


Ответы (1)


Я думаю, что слушатели вызываются после создания макета. Похоже, что создание представления происходит в какой-то момент после метода onPause(), поэтому вместо установки логического флага в onPause() вы должны установить его в слушателе.

См. здесь и здесь.

person Leszek    schedule 03.07.2012