Невозможно запустить приложение Android - NullPointerException при прослушивании щелчка

У меня возникли проблемы при попытке перехода между экранами в моем проекте Android. Я еще не создаю другие классы Activity, я просто пытаюсь открыть другие XML-файлы с помощью SetContentView(R.layout.XXX). Вот моя основная деятельность:

package com.android.eduardo.navegacao;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class NavegacaoActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    chamaTelaPrincipal();

    Button btCadastro = (Button) findViewById(R.id.btCadastro);
    btCadastro.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaCadastro();
        }
    });

    Button btConsulta = (Button) findViewById(R.id.btConsulta);
    btConsulta.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaConsulta();
        }
    });

    Button btVoltar1 = (Button) findViewById(R.id.btVoltar);
    btVoltar1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaTelaPrincipal();
        }
    });
}
public void chamaCadastro(){
    setContentView(R.layout.activity_cadastro);
}

public void chamaConsulta(){
    setContentView(R.layout.activity_consulta);
}

public void chamaTelaPrincipal(){
    setContentView(R.layout.activity_navegacao);
}

}

Как видите, "R.layout.activity_navegacao" - это мой основной макет. Когда я пытаюсь выполнить этот код, приложение закрывается, и я получаю ошибку NullPointerException, что указывает на некоторые проблемы в SetContentView.

Когда я обрезаю код последнего setOnClickListener (кнопка "btVoltar"), он работает, и я могу открыть два других экрана. Кнопка "btVoltar" используется другим XML для возврата на главный экран (activity_navegacao).

Я уже проверил идентификатор XML в классе R, и это нормально. Я также не получаю никаких сообщений об ошибках, пока не выполню проект. Извините за плохой английский, если вы, ребята, можете мне помочь, я ценю.

2 ответа

Решение

Вы получаете NullPointerException потому что вы ссылаетесь на кнопку в XML-макете, который не отображался. (т.е. кнопка не найдена на activity_navegacao.xml).

По этой причине не следует звонить setContentView несколько раз, чтобы изменить вид, как вы делаете в этом коде. Вместо этого вы должны рассмотреть возможность сделать каждый экран другой деятельностью (и setContentView только один раз за действие), или посмотрите на фрагменты и фрагменты транзакций. Фрагменты позволят вам заменить представление, как вы пытаетесь сделать здесь.

Вы можете инициализировать представления, только представление присутствует на экране. В вашем Вы четко говорите, что кнопка "btVoltar" не присутствует на вашем текущем экране (activity_navegacao). Так что инициализируйте вид после того, как его экран появится. Так измените свой код, как показано ниже

          @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    chamaTelaPrincipal();

    Button btCadastro = (Button) findViewById(R.id.btCadastro);
    btCadastro.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaCadastro();
        }
    });

    Button btConsulta = (Button) findViewById(R.id.btConsulta);
    btConsulta.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaConsulta();
        }
    });

   }
   public void chamaCadastro(){
    setContentView(R.layout.activity_cadastro);
   }

  public void chamaConsulta(){
    setContentView(R.layout.activity_consulta);
  }

public void chamaTelaPrincipal(){
    setContentView(R.layout.activity_navegacao);
     Button btVoltar1 = (Button) findViewById(R.id.btVoltar);
    btVoltar1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chamaTelaPrincipal();
        }
    });
}

}
Другие вопросы по тегам