zoukankan      html  css  js  c++  java
  • 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 来达到画面切换目的的,要注意重新绘制以后重新取得引用。

    原文链接


    作者:kissazi2
    出处:http://www.cnblogs.com/kissazi2/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    python中kafka生产者和消费者实现
    bzip2压缩
    gzip压缩
    对目录、文件操作需要的权限
    Linux文件查找
    Linux文件种类与扩展名
    centos 文件权限与目录权限
    centos关机命令
    私有方法私有属性继承问题
    python3 中类的__del__方法
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2711812.html
Copyright © 2011-2022 走看看