好吧,我尝试使用DDMS调试我的代码,但我还不能确定它的问题。我想这是因为我的程序在发布时崩溃了。无论如何,我把它展示给一个伙伴,他无法弄清楚我做错了什么。有人可以指出为什么我的应用程序在启动时崩溃了吗?
感谢:
答案 0 :(得分:4)
您遇到的问题是您正在全局区域中创建UI元素。如果希望它是全局对象,可以在那里声明它们,但是在设置内容视图之后才能实例化它们。例如:
private RadioButton rockRB;
private RadioButton paperRB;
private RadioButton scissorsRB;
private TextView result;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Content View Must be set before making UI Elements
rockRB = (RadioButton)findViewById(R.id.radioRock);
paperRB = (RadioButton)findViewById(R.id.radioPaper);
scissorsRB = (RadioButton)findViewById(R.id.radioScissors);
result = (TextView)findViewById(R.id.result);
答案 1 :(得分:1)
实际上非常简单。初始化类时,初始化变量rockRB,paperRB,scissorRB和结果。在您调用findViewById(...)时,尚未加载布局,因此找不到具有指定标识的视图。函数findViewById因此返回null以指示。当您稍后尝试使用存储的id(为空)时,您将获得空指针异常,因此整个应用程序崩溃。
要解决您的问题,请使用findViewById(...)将变量初始化移动到setContentView语句下面的函数onCreate,但是在setOnClickListener语句之前。
像这样:
公共类RockPaperScissorsActivity扩展Activity实现Button.OnClickListener { /** 在第一次创建活动时调用。 * /
private RadioButton rockRB;
private RadioButton paperRB;
private RadioButton scissorsRB;
private TextView result;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
rockRB = (RadioButton)findViewById(R.id.radioRock);
paperRB = (RadioButton)findViewById(R.id.radioPaper);
scissorsRB = (RadioButton)findViewById(R.id.radioScissors);
result = (RadioButton)findViewById(R.id.result);
rockRB.setOnClickListener(this);
paperRB.setOnClickListener(this);
scissorsRB.setOnClickListener(this);
}
依旧......