Chinaunix首页 | 论坛 | 博客
  • 博客访问: 548318
  • 博文数量: 179
  • 博客积分: 3845
  • 博客等级: 中校
  • 技术积分: 2003
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 21:25
文章分类
文章存档

2012年(74)

2011年(105)

分类: 嵌入式

2011-07-21 22:32:23


前两天写日历程序的时候,碰到一个问题:就是通过函数findViewByid(int id)所得到的对象指针总是为NULL,
瞎折腾了一上午,最后确发现自己犯了一个很低级的错误,也是我这样的新手可能会轻易犯的错误,现记录在此。

代码:
  1. 1. package com.android.test.firstActivityAct;
  2.    2.

  3.    3. import android.app.Activity;
  4.    4. import android.os.Bundle;
  5.    5. import android.util.Log;
  6.    6. import android.widget.TextView;
  7.    7.

  8.    8. public class FirstActivityActActivity extends Activity {
  9.    9. /** Called when the activity is first created. */
  10.   10. @Override
  11.   11. public void onCreate(Bundle savedInstanceState) {
  12.   12. super.onCreate(savedInstanceState);
  13.   13. //setContentView(R.layout.main);
  14.   14.
  15.   15. //通过资源ID获取文本对象
  16.   16. TextView textview =(TextView)findViewById(R.id.textview01);
  17.   17. textview.setText("This is my first Android application!");
  18.   18.
  19.   19. if(textview == null){
  20.   20. Log.d(getClass().getName(),"Get text view failed!");
  21.   21. return;
  22.   22. }
  23.   23.
  24.   24. //设置内容视图
  25.   25. setContentView(R.layout.main);
  26.   26.
  27.   27. }
若如上代码,执行程序后 textview = null;

正确方法应该是将25行代码setContentView(R.layout.main);放到13行 处,即在16前面,才能正确获得文本
对象。

前者为什么通过“findViewById"方法 无法通过已经定义好的资源ID来获取该资源对象。实际上通过Android
SDK文档,就可以看出端倪。

对于“findViewById"方法的ID参数,必须是“onCreate(Bundle)"函数处理过的XML文件。也就是说,该ID不能
一经过定义就可以使用,而是需要等“onCreate"函数对XML文件进行处理之后。

而在“onCreate(Bundle)“函数中,需要先调用“setContentView(int)”方法来填充Activity的用户界面。而
”setContentView(int)"方法的作用是:填充ID所指定的布局资源,将该资源中定义的高级可视组件添加到
Activity中。

现在应该明白了:要使用一个布局内的组件,必须先通过“setContentView(in)"方法来填充该布局资源。也就是
说,fingViewById方法必须在“setContentView(int)”方法之后调用。


阅读(1714) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~