2013-11-23 45 views
1

從Android開發者documentation,聲明全文下:唯一一個樹內用於查看對象的ID的

的ID不一定是整個樹獨特,但它應該是 部分中是唯一的(通常可能是 是整棵樹,因此當 可能時最好是完全唯一的)。

請幫我理解一下,你正在搜索的樹的一部分是什麼意思?

例如,給出如下:

<AnOutterLayout> 

    <Button android:id="@+id/my_button".../> 

    <ASuitableInnerLayout> 

    <Button android:id="@+id/my_button".../> 

    </ASuitableInnerLayout> 

</AnOutterLayout> 

如果我有:

Button myButton = (Button) findViewById(R.id.my_button); 

會有什麼搜索樹在這裏?

謝謝!

+0

林特會警告你,如果你有相同的佈局相同的編號 – Raghunandan

回答

0

的「您正在搜索的樹的一部分」是ViewGroup你打電話findViewById通常孩子上。

Activity,該findViewById方法是這樣實現的(source):

public View findViewById(int id) { 
    return getWindow().findViewById(id); 
} 

好了,如何做一個Window實現findViewByIdsource)?

public View findViewById(int id) { 
    return getDecorView().findViewById(id); 
} 

getDecorView返回View - 和所有的View實施工作不就是返回本身(如果該視圖ID相匹配的一個傳遞),或者爲空(source):

public final View findViewById(int id) { 
    if (id < 0) { 
     return null; 
    } 
    return findViewTraversal(id); 
} 

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 
    return null; 
} 

這是多少更有趣的,如果我們看一下一個ViewGroupsource)執行:

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 

    final View[] where = mChildren; 
    final int len = mChildrenCount; 

    for (int i = 0; i < len; i++) { 
     View v = where[i]; 

     if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) { 
      v = v.findViewById(id); 

      if (v != null) { 
       return v; 
      } 
     } 
    } 

    return null; 
} 

所以您會看到一個ViewGroup遍歷其孩子搜索您通過的ID。我不確定mChildren的順序,但我懷疑它會按照您將視圖添加到層​​次結構的順序(只是選中 - addView(View child)確實會添加mChildren列表末尾的視圖,其中addView(View child, int index)在列表中的index位置添加視圖)。

因此,對於您的示例,返回哪個按鈕將取決於您打電話給哪個ViewGroupfindViewById

如果您撥打anOutterLayout.findViewById(R.id.my_button),您會看到第一個按鈕 - 因爲它是第一個包含該ID的子元素。

如果您撥打anInnerLayout.findViewById(R.id.my_button),您會看到第二個按鈕。

但是,如果你的佈局文件是這樣的:

<AnOutterLayout> 

    <ASuitableInnerLayout> 

    <Button android:id="@+id/my_button".../> 

    </ASuitableInnerLayout> 

    <Button android:id="@+id/my_button".../> 

</AnOutterLayout> 

然後anOutterLayout.findViewById(R.id.my_button)實際上返回按鈕內佈局內 - 因爲這種觀點逐層增加較早,因此早在爲該觀點的兒童名單。

這假定視圖按照它們在XML視圖層次結構中的順序添加。

0

outter圖層中的按鈕將首先被調用。

這篇文章對您的問題很好解釋的答案

Are Android View id supposed to be unique?

+0

這是一個很好的指針。但是,我特別想明白'......部分......',正如該文件明確指出的那樣。否則,很明顯第一場比賽被選中。但是,當文檔提到您可以在樹的一部分中進行搜索時會出現混淆。所以,我想知道如何在子樹中搜索?換句話說,如何告訴Android在子樹內搜索? – user1418717

+0

這是一個有趣的想法,我從來沒有想過這個。到目前爲止,我沒有看到關於這個話題的任何討論。這是Android爲你做的事情,似乎它不允許自定義搜索。 – chinglun