【初级】findViewById返回空指针,原因是什么?

flyingghost 2013-04-02 12:09:05
布局文件大致是这样的结构:
activity_main.xml
<LinearLayout
android:id="@+id/main_layout">
<Button
android:id="@+id/start_button">

代码是这样的
setContentView(R.layout.activity_main);//这句可用
button = (Button) findViewById(R.id.start_button);//这句也没问题
mainView = findViewById(R.id.main_layout);//这句会返回空指针

请教:
1,同样的通过id来查找view对象,为什么第三行会返回null?
2,xml布局文件生成的R.layout.activity_main资源和文件内容生成的R.id.main_layout资源,二者有什么不同?

谢谢解答!
...全文
321 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldmtn 2013-06-28
  • 打赏
  • 举报
回复
引用 7 楼 songxh2 的回复:
安卓开发生手遇到不能动态创建图片,郁闷啊!后来经过调试发现是layout对象获取总是为null, 原来获取布局对象不能用布局资源id,必须用id的id

	LinearLayout lay1=(LinearLayout)findViewById(R.layout.xerllent_main)  //错!!
	LinearLayout lay1=(LinearLayout)findViewById(R.id.xerllent_main);     //对!!
yes....~~
songxh2 2013-06-28
  • 打赏
  • 举报
回复
安卓开发生手遇到不能动态创建图片,郁闷啊!后来经过调试发现是layout对象获取总是为null, 原来获取布局对象不能用布局资源id,必须用id的id

	LinearLayout lay1=(LinearLayout)findViewById(R.layout.xerllent_main)  //错!!
	LinearLayout lay1=(LinearLayout)findViewById(R.id.xerllent_main);     //对!!
szzjjj 2013-04-04
  • 打赏
  • 举报
回复
1、简单点来说,R.layout.activity_main是指activity_main布局描述资源,而R.id.main_layout是activity_main中LinearLayout 2、setContentView以后,findViewById会在根据activity_main布局生成的View中去找id为main_layout的组件,在setContentView之前调用findViewById,基本的View都没有,根本无从找起,当然是null了 建议仔细的看一下Android Activity相关类的源代码,看google的源码,很多东西就一目了然了
  • 打赏
  • 举报
回复
1.mainView = (LinearLayout)findViewById(R.id.main_layout); 2.其实意义是一样的。
flyingghost 2013-04-02
  • 打赏
  • 举报
回复
引用 1 楼 guoyoulei520 的回复:
1.没看到你的类型转换啊,不过也不至于为空。 2.R.layout代表整个资源文件。R.id只是引用某表控件
多谢回答。 1,确实为null了,我也很奇怪。 2,我想问的就是引用整个布局资源和引用某控件有什么区别?是不是理论上都可用setContentView()?
凉凉二点凉 2013-04-02
  • 打赏
  • 举报
回复
1.没看到你的类型转换啊,不过也不至于为空。 2.R.layout代表整个资源文件。R.id只是引用某表控件
flyingghost 2013-04-02
  • 打赏
  • 举报
回复
尝试了一下得出以下结论: setContentView(R.layout.activity_main);//可以正常工作 setContentView(R.id.main_layout);//抛出异常,android.content.res.Resources$NotFoundException 问题1,对于setContentView来说,他俩有什么区别? 以及, protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mainView1 = (LinearLayout)findViewById(R.id.main_layout);//在setContentView之前,是null setContentView(R.layout.activity_main); mainView2 = (LinearLayout)findViewById(R.id.main_layout);//在setContentView之后,正常获取 } 问题2,setContentView前后有什么区别?如果我不打算set,直接从布局资源生成一个view,应该用什么方法?

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧