2015-10-28 59 views
1

(對於上下文,)我試圖擴展GridView,使其像ListView和頁眉&頁腳,但findViewById不起作用。當我看着ListView的來源,我發現:爲什麼ViewGroup中的某些受保護方法不可覆蓋,而不是在文檔中?

@Override 
protected View findViewTraversal(int id) { 
    View v; 
    v = super.findViewTraversal(id); 
    ... 
} 

然而Android的工作室(和搖籃)告訴我,findViewTraversal不存在的,即使它在ViewGroup's source中也存在,這意味着它應該是在GridView控件。

爲什麼我無法在我的子類中重寫此方法?

我是否遺漏了Java語言的某些部分,因爲我認爲受保護的方法可通過繼承使用? findViewTraversal()也不存在於Android文檔中,所以它顯然不是意味着被使用,但我不明白如何不能

+0

我試圖找出答案,但找不到明確的答案。你可能會在這裏找到幫助(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) –

+0

只是一個評論,涉及到你實際上在嘗試什麼在這裏實現(*「將GridView擴展爲像ListView並具有頁眉和頁腳」*):您是否搜索過現有的解決方案?我很確定有。或者,考慮使用具有['GridLayoutManager']的'RecyclerView'(http://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.html) - 這將允許您添加頁眉/頁腳(通過使項目跨越多列)相當容易。 –

回答

0

(...)它也存在於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的一部分是有原因的。

相關問題