Activity的findViewById()和View的findViewById()
来源:互联网 发布:java 接口变量 编辑:程序博客网 时间:2024/04/30 15:08
原文地址
我们就知道了这样一个函数findViewById(),他已经成为了家喻户晓,坑蒙拐骗,杀人越货必备的一个函数(好吧,这句是扯淡)
但一直用也没细致研究过它,直到写程序的时候发现一个由这个函数引起的一个莫名其妙的bug,遂决定好好研究下次函数~
我们调用的findViewById()函数其实有两种(目前我只看到两种,不确定还有没有其他的),一种是Activity类中findViewById()函数
另外一种是View类中定义的findViewById()函数
一般我们在oncreate()方法中使用的(**view)findViewById(R.id.**)既是调用的Activity中的findViewById()函数
而在其他情况写出的***view.findViewById()中调用的是view类中的findViewById()
分别看一下源代码中的实现方法及介绍
Activity类中定义的findViewById()
/** * Finds a view that was identified by the id attribute from the XML that * was processed in {@link #onCreate}. * * @return The view if found or null otherwise. */ public View findViewById(int id) { return getWindow().findViewById(id); } /** * Retrieve the current {@link android.view.Window} for the activity. * This can be used to directly access parts of the Window API that * are not available through Activity/Screen. * * @return Window The current window, or null if the activity is not * visual. */ public Window getWindow() { return mWindow; }
从这里可以看出这个函数是在寻找在xml中定义的指定id的对象
View类中的findViewById()
/** * Look for a child view with the given id. If this view has the given * id, return this view. * * @param id The id to search for. * @return The view that has the given id in the hierarchy or null */ public final View findViewById(int id) { if (id < 0) { return null; } return findViewTraversal(id); /** * {@hide} * @param id the id of the view to be found * @return the view of the specified id, null if cannot be found */ protected View findViewTraversal(int id) { if (id == mID) { return this; } return null; }
从这里可以看出我们是从一个view的child view中寻找指定id的对象,所以即使几个layout的XML文件中的View的id号相同的话,只要他们没有相同的父节点,或有相同的父亲节点,但不在父节点及以上节点调用findViewById通过id来查找他们就是没有问题。(这句引用自这里)
使用这个函数的常见问题:
1.既然Activity中的findViewById()是从R.java中寻找东西,那么我们就要杜绝相同名字的控件
今天自己的bug就是因为这个产生的
说到控件的命名,今天还有一个小发现
仔细看下边两段代码代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout>
一段里边Layout没有id这个参数,一段里边有id,虽然代码不同但在outline中显示出来都是
这样在第一种情况下R.id中可以找到LinearLayout这个控件,第二种是没有的哈,这些也是以后要注意的细节
2.在调用view中的findViewById()一定要想好父View是谁!即**view.findViewById()中的**view要找对,如果没有找对父View,返回基本都是null了
1 0
- Activity的findViewById()和View的findViewById()
- view.findViewById 和Activity.findViewById区别
- view.findViewById 和Activity.findViewById区别
- View.findViewById() vs Activity.findViewById()
- findViewById在Activity和View中的区别
- LayoutInflater和findViewById的区别
- LayoutInflater和findViewById() 的区别
- ayoutInflater和findViewById() 的区别
- findViewById的参数错误
- 减少findViewByID的书写
- android findViewById(...)的抽取
- android的进阶findViewById
- 转---FindViewById的替代
- 关于findViewByid的简写
- findviewbyid的插件 --------ButterKnife
- 懒人的findviewbyid
- inflate()和findViewById()函数的用法
- setContentView和inflate调用findViewById的区别
- HOG特征
- bzoj3158 千钧一发
- 数据结构-->队列的链式实现 ADT
- 获取当前计算机所有性能计数器
- markdown的11种简单语法
- Activity的findViewById()和View的findViewById()
- 基于webSocket实现的一对一在线聊天系统
- Number of Islands
- 不同BIOS下的U盘启动设置方法
- com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
- Exchange 2010 PS之获取移动设备相关信息!
- c语言scanf返回值
- GCC/G++编译原理分析
- HDU 2187 悼念512汶川大地震遇难同胞——老人是真饿了