无法启动Android应用程序 - Click Listener上的NullPointerException

时间:2014-11-21 03:22:53

标签: android android-activity nullpointerexception onclicklistener setcontentview

我在Android项目中尝试在屏幕之间导航时遇到了一些问题。我还没有创建其他的活动类,我只是试图通过SetContentView(R.layout.XXX)打开其他XML文件。这是我的主要活动:

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)。

我已经检查了R类上的XML的ID,没关系。在执行项目之前,我也没有收到任何错误通知。对不起英语不好,如果你们能帮助我,我很感激。

2 个答案:

答案 0 :(得分:2)

您正在获取NullPointerException,因为您正在引用尚未显示的XML布局上的按钮。 (即activity_navegacao.xml)上找不到该按钮。

因此,您不应多次调用setContentView来更改视图,就像您在此代码中所做的那样。相反,您应该考虑将每个屏幕设置为不同的活动(并且每个活动仅调用setContentView一次),或者查看Fragments和FragmentTransactions。片段将允许您替换视图,就像您尝试在此处一样。

答案 1 :(得分:0)

你可以初始化视图只有视图存在于屏幕中。在你的明确说明当前屏幕中没有按钮“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();
        }
    });
}

}
相关问题