-1

我在我的 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”)的代码时,它可以工作,我可以打开另外两个屏幕。其他 XML 正在使用按钮“btVoltar”返回主屏幕 (activity_navegacao)。

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

4

2 回答 2

2

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

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

于 2014-11-21T03:56:35.913 回答
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();
        }
    });
}

}
于 2014-11-21T03:50:07.870 回答