前两天写日历程序的时候,碰到一个问题:就是通过函数findViewByid(int id)所得到的对象指针总是为NULL,
瞎折腾了一上午,最后确发现自己犯了一个很低级的错误,也是我这样的新手可能会轻易犯的错误,现记录在此。
代码:
- 1. package com.android.test.firstActivityAct;
-
2.
-
-
3. import android.app.Activity;
-
4. import android.os.Bundle;
-
5. import android.util.Log;
-
6. import android.widget.TextView;
-
7.
-
-
8. public class FirstActivityActActivity extends Activity {
-
9. /** Called when the activity is first created. */
-
10. @Override
-
11. public void onCreate(Bundle savedInstanceState) {
-
12. super.onCreate(savedInstanceState);
-
13. //setContentView(R.layout.main);
-
14.
-
15. //通过资源ID获取文本对象
-
16. TextView textview =(TextView)findViewById(R.id.textview01);
-
17. textview.setText("This is my first Android application!");
-
18.
-
19. if(textview == null){
-
20. Log.d(getClass().getName(),"Get text view failed!");
-
21. return;
-
22. }
-
23.
-
24. //设置内容视图
-
25. setContentView(R.layout.main);
-
26.
-
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) |