findViewById()使用常见错误
2010-09-28 12:27
246 查看
Android中FindViewById()是一个非常常用的函数,位于android.app.Activity包中。该函数利用我们在XML文件中定义的View的id属性来获取相应的View对象。findViewById()属于API Level 1, 对应的android版本是android1.0, 由此,可以看出,该函数是android早期版本中就有的。顺便说一下, android目前市场上已商用的版本及其对应的API Level如下:
android 1.0 API Level 1
android 1.1 API Level 2
android 1.5 API Level 3
android 1.6 API Level 4
android 2.0 API Level 5
android 2.0.1 API Level 6
android 2.1 API Level 7
android 2.2 API Level 8
不过,截至本文发布之时,Google目前已经准备发布android 3.0,同时,android 3.5已经在紧锣密鼓的研发中了。
书归正传,来看看,本人在使用该函数中遇到的几个问题:
1、参数错误:findViewById的参数是一个View的ID,如果在XML文件中没定义相应的ID,则程序会
善意的告诉你:XXX cannot be resulved。此时,补充定义就可以了。
2、未指定调用布局:findViewById()的调用与具体的布局有关,默认的是main.xml中的布局,函数前
没有布局指示。不过,当我们在main.xml描述的布局中,添加其它布局时,利用该函数获
取所添加布局中的View,则需在调用时,添加布局名,形式如下:
addLayout.findViewById(), 如果不这么做,程序编译时有时不会报错,但运行时会
提示遇到异常,并强制关闭应用。
3、命名冲突:这个错误可能不是很常见,不过,要是没有遇到过,猛的来这么一下,还真让人
有点懵。
呵呵,本人就犯过这样的错误。解释下,这里的命名冲突是指当前工程中定义的类与
android在Framework中提供的名字相同,这样的话,当前工程文件中,会优先使用本工
程中的定义。当然,使用findViewById()函数时,发生这种错误必须满足以下几个条件:
一是:需要在当前工程中利用ID(xml中定义)来查找对应的View对象;
二是:查找的View类名恰好与本工程中已有的类定义相同
三是:同名的两个类实例化后产生的对象类型不同,如:一个是View, 一个是Activity。
下面就本人遇到的问题3的情况进行说明。
我是在做android下的抽屉效果时,将应用程序直接命名为SlidingDrawer,对用的Activity名自然就是SlidingDrawer,同时,在布局文件main.xml文件中定义了一个SlidingDrawer的View。为了实现抽屉效果,程序中需要通过findViewById()来获取布局中的SlidingDrawer对象。结果,提示如下错误:
“SlidingDrawer cannot cast from View to SlidingDrawer”。当时就懵了,用了这么长时间findViewById()从来没发生过这样的情况。于是,就仔细看xml文件,没发现任何异常。再看看错误提示,很明显findViewById返回的是View,却无法强制转换给SlidingDrawer类型, 难道SlidingDrawer不是View?此时,我突然觉得可能在什么地方重新定义了,想想只可能是自己做了不应该做的事情, 凭借这些年来的开发经验:当程序出现问题时,犯错误的总是人。最有,在自己的工程中一看,很明显Activity的名字是SlidingDrawer,原来,这里把SlidingDrawer当作Activity类型了,所以转换失败。赶紧,重新命名工程,问题解决。
总结:给应用程序命名时,尽量避免与android Framework中的类同名。
android 1.0 API Level 1
android 1.1 API Level 2
android 1.5 API Level 3
android 1.6 API Level 4
android 2.0 API Level 5
android 2.0.1 API Level 6
android 2.1 API Level 7
android 2.2 API Level 8
不过,截至本文发布之时,Google目前已经准备发布android 3.0,同时,android 3.5已经在紧锣密鼓的研发中了。
书归正传,来看看,本人在使用该函数中遇到的几个问题:
1、参数错误:findViewById的参数是一个View的ID,如果在XML文件中没定义相应的ID,则程序会
善意的告诉你:XXX cannot be resulved。此时,补充定义就可以了。
2、未指定调用布局:findViewById()的调用与具体的布局有关,默认的是main.xml中的布局,函数前
没有布局指示。不过,当我们在main.xml描述的布局中,添加其它布局时,利用该函数获
取所添加布局中的View,则需在调用时,添加布局名,形式如下:
addLayout.findViewById(), 如果不这么做,程序编译时有时不会报错,但运行时会
提示遇到异常,并强制关闭应用。
3、命名冲突:这个错误可能不是很常见,不过,要是没有遇到过,猛的来这么一下,还真让人
有点懵。
呵呵,本人就犯过这样的错误。解释下,这里的命名冲突是指当前工程中定义的类与
android在Framework中提供的名字相同,这样的话,当前工程文件中,会优先使用本工
程中的定义。当然,使用findViewById()函数时,发生这种错误必须满足以下几个条件:
一是:需要在当前工程中利用ID(xml中定义)来查找对应的View对象;
二是:查找的View类名恰好与本工程中已有的类定义相同
三是:同名的两个类实例化后产生的对象类型不同,如:一个是View, 一个是Activity。
下面就本人遇到的问题3的情况进行说明。
我是在做android下的抽屉效果时,将应用程序直接命名为SlidingDrawer,对用的Activity名自然就是SlidingDrawer,同时,在布局文件main.xml文件中定义了一个SlidingDrawer的View。为了实现抽屉效果,程序中需要通过findViewById()来获取布局中的SlidingDrawer对象。结果,提示如下错误:
“SlidingDrawer cannot cast from View to SlidingDrawer”。当时就懵了,用了这么长时间findViewById()从来没发生过这样的情况。于是,就仔细看xml文件,没发现任何异常。再看看错误提示,很明显findViewById返回的是View,却无法强制转换给SlidingDrawer类型, 难道SlidingDrawer不是View?此时,我突然觉得可能在什么地方重新定义了,想想只可能是自己做了不应该做的事情, 凭借这些年来的开发经验:当程序出现问题时,犯错误的总是人。最有,在自己的工程中一看,很明显Activity的名字是SlidingDrawer,原来,这里把SlidingDrawer当作Activity类型了,所以转换失败。赶紧,重新命名工程,问题解决。
总结:给应用程序命名时,尽量避免与android Framework中的类同名。
相关文章推荐
- findViewById()使用常见错误
- 使用dataBinding,真正不用findViewById
- 你还在苦逼地findViewById吗?使用ButterKnife从此轻松定义控件
- 很多点击事件,通过方法减少使用findViewbyid
- Android使用TabHost程序异常终止could not create tab content because could not find view with id 错误
- findViewById值为null,报nullpointer错误的问题
- 使用include findViewById 返回null
- android 减少findViewById 的使用
- findViewById出现错误View.isRootNamespace()' on a null object reference
- 求助 android开发中 如果两个控件的id相同 会怎样?如何使用findviewbyid ()寻找到?
- Android解决使用findViewById时需要对返回值进行类型转换问题的辅助类
- ExpandableListActivity使用findViewById查找child中view的时序问题
- Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决
- Android studio 使用findviewbyme 快速生产 findviewbyid 引用资源
- LayoutInflater 的基本使用; LayoutInflater ,setContentView,findViewById三者的对比。
- 如何在Fragment中使用findViewById
- 你还在苦逼地findViewById吗?使用ButterKnife从此轻松定义控件
- ButterKnife的基本使用_____摆脱findviewbyid
- Android--xml控件写法和findViewById的对应使用
- 122.xUtils使用inject取代findViewById的方法填充布局