Невозможно запустить приложение 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();
}
});
}
}