findViewById返回Null

简介:

10-04 17:43:05.400: E/AndroidRuntime(7135): Caused by: java.lang.NullPointerException
10-04 17:43:05.400: E/AndroidRuntime(7135): at com.solar.LoginActivity.initView(LoginActivity.java:35)
10-04 17:43:05.400: E/AndroidRuntime(7135): at com.solar.LoginActivity.onCreate(LoginActivity.java:17)
10-04 17:43:05.400: E/AndroidRuntime(7135): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-04 17:43:05.400: E/AndroidRuntime(7135): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-04 17:43:05.400: E/AndroidRuntime(7135): ... 11 more

 

 

如下所示,是提示错误的OnCreate函数。

1 protected void onCreate(Bundle savedInstanceState) {
2         super.onCreate(savedInstanceState);
3         Button btnLogin = (Button) findViewById(R.id.login_btn_login);                     //这里出错
4         this.setContentView(R.layout.login_page);
5     }

 

NullPointerException?找了好久,搞不清楚为什么出现这个错误。因为这句话怎么也看不出错误。布局文件里面也确实有login_btn_login这个按钮。

Button btnLogin = (Button) findViewById(R.id.login_btn_login);

后面终于想到:整个Activity都还没有渲染R.layout.login_page这个布局文件呢。怎么能要求他在R.layout.login_page这个布局文件里面找到按钮呢。所以返回的是null。

 

终于找到一段更好的解释:

当activity 调用 setContentView() 时,android 才会去绘制 layout 上的各个元素,并为其分配内存。只有 分配了内存以后,才能继续执行 ,findViewById(); 才能得到引用,不然得到空引用。

空引用意味着,后面使用相应变量时就会发生访问的对象不存在的问题。

而且当Activity重新setContentView()以后,那些之前绘制的控件,内存都被灭掉了。

所以,若是通过setContentView 来达到画面切换目的的,要注意重新绘制以后重新取得引用。

 

原文链接

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/archive/2012/10/04/2711812.html如需转载请自行联系原作者

kissazi2
相关文章
|
敏捷开发 存储 搜索推荐
《阿里巴巴Java开发手册v1.4.0(详尽版)》更新,新增16条设计规约
阿里巴巴集团推出的《阿里巴巴Java开发手册》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Java开发者能够提升协作效率、提高代码质量。
737747 3
|
存储 Android开发
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
1715 0
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
1240 2
|
调度 数据库 计算机视觉
并行和并发的区别(详细)
并行和并发的区别(详细)
|
人工智能 自然语言处理 IDE
Codeium:免费的人工智能代码加速
Codeium:免费的人工智能代码加速
1914 1
|
移动开发 JSON API
h5调起原生分享面板,展示更多功能方案
h5调起原生分享面板,展示更多功能方案
397 0
|
Android开发 iOS开发
关于android 字体设置为中等粗细
Android TextView设置字体粗细只有三种状态,textStyle取值只有bold、nomral、italic、客户需求是字体是medium粗细,只因ios是有medium属性,Android被要求要一样;
1624 0
关于android 字体设置为中等粗细
|
Android开发
The application could not be installed: INSTALL_FAILED_TEST_ONLY. Android App包安装失败(Bug记录)
The application could not be installed: INSTALL_FAILED_TEST_ONLY. Android App包安装失败(Bug记录)
|
Android开发
Android Studio插件的源文件位置——mac端
Android Studio中我们可以通过菜单栏的`Android Studio --> preferences --> plugins`来查看我们安装的插件。这里介绍下插件的实际安装位置。
|
Android开发
【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )(一)
【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )(一)
660 0
【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )(一)