Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中findViewById返回為空null的快速解決辦法

Android中findViewById返回為空null的快速解決辦法

編輯:關於Android編程

【問題描述】

Android中如下代碼:

LinearLayout groupPollingAddress = (LinearLayout)findViewById(R.layout.fragment_field_list);

返回為null。

【解決過程】

1.參考:

android – getActivity().findViewById(R.layout.contacts_list_view) returns null – Stack Overflow

AndroidGUI27中findViewById返回null的快速解決辦法 – 玄機逸士的專欄 – 博客頻道 – CSDN.NET

但是沒搞定。

2.後來是去搜:

findViewById R.layout null

而最終找到並參考:

[Android]inflate方法與 findViewById 方法區別 | LayoutInflater的inflate函數用法詳解 – loyea – 博客園

去換為:

LayoutInflater inflater = (LayoutInflater)tabContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout groupPollingAddress = (LinearLayout)inflater.inflate(R.layout.fragment_field_list, null);

即可。

3.另外的,類似的:

TextView tab1AllGroupPollingAddressLabel = (TextView) findViewById(R.id.lblVariable);

也是返回null,所以去換為:

TextView tab1AllGroupPollingAddressLabel = (TextView) groupPollingAddress.findViewById(R.id.lblVariable);
即可。

【總結】

此處findViewById返回為null,原因是:

沒有在索要find的子view的Parent中去找

或者是:

當然的View下面,沒有包含對應的想要找的view,

從而導致找不到,返回null。

解決辦法是:

找到要找的view的parent或root的view

再在父級的view中找你要的子view就可以了。

常見的寫法是:

LayoutInflater inflater = (LayoutInflater)tabContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout groupPollingAddress = (LinearLayout)inflater.inflate(R.layout.fragment_field_list, null);

其中是先去找到當前系統的Layout,然後實例化,然後在全局的view中再去找你的view就可以找到了。

PS:Android 自定義view中findViewById為空的快速解決辦法

網上說的都是在super(context, attrs);構造函數這裡少加了一個字段,其實根本不只這一個原因,屬於view生命周期的應該知道,如果你在自定義view的構造函數裡面調用findViewById 鐵定為空的,因為這個時候view還在初始化階段,還沒有添加到activity的XML布局上,所以你怎麼調用都是沒用的,解決辦法就是把我們的findViewById方法換一個生命周期上面調用就OK了,比如我就是在

 protected void onAttachedToWindow() {
super.onAttachedToWindow();} 

上面調用的

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved