(...)它也存在於ViewGroup的源代碼中,也就是說它應該在GridView中。
正確,而且是。你沒有看到它的原因,是因爲該方法被註解爲@hide
:
/**
* {@hide} <-- !!!
*/
@Override
protected View findViewTraversal(int id) { ... }
這一點很難從自己的ViewGroup
鏈接告知,但如果你的行號仔細觀察,你會注意跳躍。如果您現在查看該文件的raw source,則應該更清楚。小方面說明:你所引用的真的是老版本的ViewGroup
。
返回@hide
:這是documented here:
當應用到包,類,方法或字段,@hide將刪除文檔該節點及其所有兒童。
基本上,註釋表明該方法不是公開API的一部分,因此不應公開這些公開API。在Android Studio中,註釋還具有阻止方法顯示的副作用(不確定有關Eclipse),因此您不會「意外」使用它。
現在,ListView
是一個特例。它是唯一ViewGroup
實際覆蓋findViewTraversal(int id)
方法(不包括ExpandableListView
,因爲它擴展ListView
):
/* (non-Javadoc)
* @see android.view.View#findViewById(int)
* First look in our children, then in any header and footer views that may be scrolled off.
*/
@Override
protected View findViewTraversal(@IdRes int id) { ... }
如果你看一下源代碼段中,你會看到它覆蓋「隱藏'超級方法,不是有@hide
註釋。由於它包含(non-Javadoc)
,因此我只能假定它是作爲ListView
的公共API的一部分而被有意暴露的。因此,它實際上列在method documentation中,但當然僅限於此類。
所以簡而言之:方法在那裏,對於每個ViewGroup
,但它(默默地)不會在默認情況下公開。在任何人問起之前:是的,你可以使用反射來訪問/調用該方法,但我不會依賴這個方法。該方法不屬於公共API的一部分是有原因的。
我試圖找出答案,但找不到明確的答案。你可能會在這裏找到幫助(http://stackoverflow.com/questions/3071720/why-cant-my-subclass-access-a-protected-variable-of-its-superclass-when-its-i)或者[這裏(jls)](http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.2) –
只是一個評論,涉及到你實際上在嘗試什麼在這裏實現(*「將GridView擴展爲像ListView並具有頁眉和頁腳」*):您是否搜索過現有的解決方案?我很確定有。或者,考慮使用具有['GridLayoutManager']的'RecyclerView'(http://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.html) - 這將允許您添加頁眉/頁腳(通過使項目跨越多列)相當容易。 –