EditText NullPointerException — обработка событий

avatar
Emre
7 апреля 2018 в 22:39
28
1
-2

У меня есть кнопка, которая добавляет объект в представление списка. Я хочу реализовать его отдельно в классе Handler, поэтому я вызываю new Handler(this) внутри .setOnClickListener.

Вот как я называю Handler в классе MainActivity:

Button button_createTask = (Button) findViewById(R.id.button_createTask);
button_createTask.setOnClickListener(new Handler(this));

Это внутри класса Handler:

public class Handler implements View.OnClickListener {

private MainActivity mainActivity;

public Handler(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
}

public void onClick(View view) {
    // Read task data
    EditText etTaskName = (EditText) view.findViewById(R.id.editText_taskName);
    EditText etTaskDate = (EditText) view.findViewById(R.id.editText_taskDate);
    EditText etTaskDescription = (EditText) view.findViewById(R.id.editText_taskDescription);

    // Save task name
    String taskName = etTaskName.getText().toString();

    //...
}

Мое приложение аварийно завершает работу со следующей ошибкой, указывающей на строку String taskName = etTaskName.getText().toString();:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.myapplication, PID: 10287
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                  at com.example.myapplication.Handler.onClick(Handler.java:37)
                  at android.view.View.performClick(View.java:6294)
                  at android.view.View$PerformClick.run(View.java:24770)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Соответствующий макет:

Here is the relevant layout.

Источник

Ответы (1)

avatar
Emre
7 апреля 2018 в 22:39
0

В MainActivity вид кнопки выбирается и отправляется обработчику.

Если мы хотим найти другие элементы по их идентификатору, нам нужно представление большего размера, в этом случае достаточно родительского представления.

Измените класс обработчика следующим образом:

public void onClick(View buttonView) {
    View view = (View) buttonView.getParent();
    EditText etTaskName = (EditText) view.findViewById(R.id.editText_taskName);
    // ...