-1

我在尝试在我的Android项目的屏幕之间导航时遇到了一些问题。我还没有创建其他Activities类,我只是想通过SetContentView(R.layout.XXX)打开其他XML文件。这是我的主要活动:无法启动Android应用程序 - 点击监听器上的NullPointerException

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了,没关系。我也没有收到任何错误通知,直到我执行该项目。对不起英文不好,如果你们能帮助我,我很感激。

+0

改为改变setContentView xml以不同的xml开始新的活动。 – 2014-11-21 04:11:49

回答

2

你所得到的NullPointerException因为你引用一个按钮,是对尚未显示XML布局你的代码视图。 (即在activity_navegacao.xml上找不到该按钮)。

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

+0

哦,我现在明白了,btVoltar不在主屏幕中。感谢您的帮助,我现在开始学习Android;] – 2014-11-21 05:29:03

0

您可以只初始化视图视图存在于屏幕中。您明确表示按钮“btVoltar”不存在于当前屏幕(activity_navegacao)中。因此,初始化后的屏幕来present.So更改像下面

  @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(); 
     } 
    }); 
} 

} 
+0

感谢您的帮助,我了解了btVoltar,它不在主屏幕上。我试过你说的这种方式,但它仍然不起作用。我将为其他XML创建不同的活动类。 – 2014-11-21 05:31:08