Android开发:findViewById返回null的解决办法

2014-11-24 10:53:32 ? 作者: ? 浏览: 0

第一种情形是最普通的。比如main.xml如下,其中有一个ListView,其id为lv_contactbook


< xml version="1.0"encoding="utf-8" >


"http://schemas.android.com/apk/res/android"


android:orientation="vertical"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


>


"@+id/et_search"


android:layout_width="fill_parent"


android:layout_height="wrap_content"


android:text=""


/>



"@+id/lv_contactbook"


android:layout_width="fill_parent"


android:layout_height="wrap_content"


/>



如果在Activity对应的代码中,是这样的写的:


@Override


public void onCreate(BundlesavedInstanceState)


{


super.onCreate(savedInstanceState);


ListViewlv = (ListView)findViewById(R.id.lv_contactbook);


setContentView(R.layout.main);


//…


}


即在setContentView调用之前,调用了findViewById去找main布局中的界面元素lv_contactbook,那么所得到的lv一定是null。正确的做法是将上面代码中加粗的哪一行,挪至setContentView方法调用之后。


第二种情形。这种情况下通常是调用LayoutInflater.inflate将布局xml规定的内容转化为相应的对象。比如有rowview.xml布局文件如下(比如在自定义Adapter的时候,用作ListView中的一行的内容的布局):


< xml version="1.0"encoding="utf-8" >



xmlns:android="http://schemas.android.com/apk/res/android"


android:orientation="horizontal"


android:layout_width="fill_parent"


android:layout_height="wrap_content"


>


"@+id/tv_contact_id"


android:layout_width="0px"


android:layout_height="0px"


android:visibility="invisible"


android:gravity="center_vertical"


/>


"@+id/tv_contactname"


android:layout_width="wrap_content"


android:layout_height="36dip"


android:textSize="16dip"


android:layout_marginTop="10dip"


android:textColor="#FFFFFFFF"


/>



假定在自定的Adapter的getView方法中有类似如下的代码:


View rowview = (View)inflater.inflate(R.layout.rowview, parent, false);


TextView tv_contact_id =(TextView)rowview.findViewById(R.id.tv_contact_id);


TextView tv_contactname =(TextView)rowview.findViewById(R.id.tv_contactname);


有时候居然也会发现rowview非空,但tv_contact_id和tv_contactname都是null!仔细看代码,怎么也看不出错误来。到底是什么原因造成的呢?答案是Eclipse造成的,要解决这个问题,需要这个项目clean一次(Project菜单 -> Clean子菜单),这样就OK了。


第二种情况很隐蔽,因为代码的确没有错。如果一时没有想到解决办法会浪费很多时间。


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: