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 來達到畫面切換目的的,要注意重新繪制以后重新取得引用。

 

原文鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM