zoukankan      html  css  js  c++  java
  • View.findViewById()和Activity.findViewById()区别

    在网上看见View.findViewById() 和 Activity.findViewById()执行效率不一样

    使用Activity.findViewById()如:

    TextView tv_inner_1 = (TextView)this.findViewById(R.id.tv_inner_1);   
    TextView tv_inner_2 = (TextView)this.findViewById(R.id.tv_inner_2);  

    使用View.findViewById() 如:

    View layout_outer = this.findViewById(R.id.layout_outer);   
    TextView tv_inner_1 = (TextView)layout_outer.findViewById(R.id.tv_inner_1);   
    TextView tv_inner_2 = (TextView)layout_outer.findViewById(R.id.tv_inner_2);  


    他们都是针对下面同一个xml

        <LinearLayout>   
             <LinearLayout id="@+id/layout_outer">   
                   <TextView id="@+id/tv_inner_1"/>   
                   <TextView id="@+id/tv_inner_2"/>   
             </LinearLayout>   
        </LinearLayout>  

    自从学习android的hello world开始

    我们就知道了这样一个函数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来查找他们就是没有问题。(这句引用自这里http://www.2cto.com/kf/201204/127404.html
    使用这个函数的常见问题:
    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了

  • 相关阅读:
    sql优化
    一些有用的单词(1)
    用到的 Sed 注解
    终端工具注册码
    nginx四层、七层负载均衡配置示例
    http 状态码
    04. Golang 数据类型
    03. Golang 特性
    02. Go 命令
    01. GOPATH 目录结构划分的两种风格
  • 原文地址:https://www.cnblogs.com/soonfly/p/4872120.html
Copyright © 2011-2022 走看看