解决方案 »

  1.   

    首先,你在调用 findViewById 之前,你必然是在 activity 中设置了 setContentView, 或者在 Fragment 中重载了 onCreatedView 方法,对于 findViewById, 他只能使用在 view或者 activity 下,对于 view, 你进行遍历的根节点就是对应的 view, 对于 activity, 你对应的根节点就是你使用 setContentView 初始化的布局当你调用 findViewById 是, android 先对比本身是否具有该 id,是则返回自己,不是则判断自己是否为 ViewGroup, 如果是再对子视图进行遍历,否则返回 null, 遍历时,按照从上到下的顺序一一遍历,只要找到一个节点的 id 为搜索的 id, 则返回这个节点代表的 view, 比如说你的 layout 中有两个相同 id 的 view, 那么返回的必然是最前的那一个
      

  2.   


    那如果两个id所在的xml布局位于同一层的数(深度相同)那么是返回那一个xml的?或者说它遍历的顺序是先序,后续还是中序?还是说,遍历的顺序是按照viewgroup中xml布局文件的上下顺序?还是实际显示的布局中的上到下,左到右?
      

  3.   


    那如果两个id所在的xml布局位于同一层的数(深度相同)那么是返回那一个xml的?或者说它遍历的顺序是先序,后续还是中序?还是说,遍历的顺序是按照viewgroup中xml布局文件的上下顺序?还是实际显示的布局中的上到下,左到右?
    先序,因为系统读取的时候始终是按照你的布局文件从上到下读取,那么无论你的布局层级如何,先出现的控件在遍历时总会有限被读取到
      

  4.   

    你可以看看findViewById的源码,里面有比较详细的讲解,它会自动遍历当前所在的View tree来寻找对应的控件。