2016-10-09 10 views
1

Я пытаюсь запустить событие, когда целочисленное значение обновляется, но оно не работает. Вот код, я использую:Пользовательский прослушиватель Android для события

Декларирование Обычай Слушатель

public class fieldactivity extends AppCompatActivity implements View.OnClickListener { 
    OnModeUpdate modeupdate; //Create custom listener for mode update 

    int mode = 1; 

Режим обновления кода

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fieldsignals); 
     Button button = (Button) findViewById(R.id.mode_rotate_button); 
     button.setOnClickListener(this); 
    } 

@Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case(R.id.rotate_button): 
       mode += 1; 
       modeupdate.onEvent(); //Fire Custom Lisentener - Fails On This Line 
     } 

    } 

код интерфейса

public interface OnModeUpdate { 
//BreakPoint here, but is never reached 
     void onEvent(); 
    } 

    public void setModeupdate(OnModeUpdate eventListener) { 
     modeupdate = eventListener; 
    } 

Ошибки я получаю:

java.lang.NullPointerException: Попытка вызвать метод интерфейса Пустоты alveare.com.plcsignalconverter.fieldactivity $ OnModeUpdate.onEvent() ' на нулевой ссылке на объект

Есть ли что-то, что мне не хватает?

+2

Вы никогда не инициализировали 'modeupdate'. Вы можете посмотреть [этот ответ] (http://stackoverflow.com/questions/34710809/is-that-a-right-way-of-using-interface-callback/34711257#34711257), чтобы получить представление о том, как образцовые работы. – Onik

+0

u должен реализовать OnModeUpdate в какой-либо деятельности и определить, что делать в методе onEvent() – uguboz

+0

Вы никогда не называли 'setModeupdate', и вы никогда не реализовывали интерфейс –

ответ

0

Общее название для слушатель есть observer * дизайн рисунок. Говоря о типовой терминологии, которую вы пытаетесь достичь, нужно сделать наблюдателем, то есть modeupdate, получать уведомление, когда событие (целочисленное изменение значения) встречается внутри наблюдаемого объекта, то есть fieldactivity, взаимодействующего с пользователем.

Наблюдатель modeupdate может быть любого типа и должен реализовывать интерфейс OnModeUpdate, чтобы получать уведомления от наблюдаемого объекта. Например **

public class CustomListener implements OnModeUpdate { 
    @Override 
    public void onEvent() { 
     ... 
    } 
} 

Теперь вы можете назначить наблюдателя (modeupdate) в пределах наблюдаемого объекта (fieldactivity) одним из следующих вариантов (в соответствии с бизнес-логики):

  • инициализации modeupdate с "внешний" экземпляр класса

    OnModeUpdate modeupdate = new CustomListener(); 
    
  • инициализации modeupdate с анонимный экземпляр внутреннего класса в пределах fieldactivity класса

    modeupdate = new OnModeUpdate() { 
        @Override 
        public void onEvent() { 
         // Do stuff regarding the mode change 
        } 
    }; 
    
  • правопреемником modeupdate из-за пределов fieldactivity класса, вызвав setModeupdate(...) по ссылке на fieldactivity например ***.

Выше сказано объясняет причину NullPointerException. Вы никогда не инициализировали modeupdate. После инициализации modeupdate метод onEvent() будет активирован нажатием кнопки.

Примечание: Вы написали в комментарии к своему коду: "// BreakPoint здесь, но его никогда не достигают". Это не может быть достигнуто в объявлении интерфейса, только на экземпляре объекта, который реализует интерфейс.


* Другое название шаблон Subscriber-Publisher рисунок.
** Если OnModeUpdate интерфейс объявлен в fieldactivity использования общественного класса CustomListener реализует fieldactivity.OnModeUpdate
*** То же, что вы сделали с кнопку переменной, вызвав setOnClickListener() за пределами Кнопка класс и назначение слушателя, то есть объекта (полевая активность), который реализует View.OnClic kListener interface

0

Исключение NullPointerException вызвано вызовами на объекте null referenc, который является объектом, который не был инициализирован.

В вашем случае нулевой объект - modeUpdate. Попробуйте инициализировать его в onCreate() вашей деятельности.

modeupdate = new OnModeUpdate() { 
    @Override 
    public void onEvent() { 
     /** 
     * Write the code to handle the case 
     */ 
    } 
}; 
Смежные вопросы