2011-02-06 97 views
15

我正在寫一個自定義視圖,它可以直接擴展android.view.View。如果我嘗試訪問mScrollXmScrollY字段,則會看到「無法解析或不是字段」字段的錯誤。 source code for android.view.View有mScrollX,mScrollY和類似的變量protected。我的直接子類如何不能訪問其父類的受保護字段? (類似ScrollView顯然可以。)受保護的字段對子類不可見

P.S.我意識到我可以致電getScrollX(),但我想更新這些字段;調用setScroll()有副作用,我不想要。

+0

奇怪的是,即使在其他包中,子類也可以訪問其超類的受保護變量。我猜你會使用錯誤的版本。你能展示一些你的代碼嗎? – 2011-02-06 21:28:34

+0

行爲已確認。 – 2011-02-06 21:30:34

回答

20

這是因爲它們不是Android SDK的一部分。

下面是mScrollX的源代碼:

/** 
* The offset, in pixels, by which the content of this view is scrolled 
* horizontally. 
* {@hide} 
*/ 
@ViewDebug.ExportedProperty(category = "scrolling") 
protected int mScrollX; 

你會發現@hide註解。這意味着這不是Android SDK的一部分。創建Android SDK的構建過程的一部分不會將此數據成員包含在您正在編譯的android.jar文件中的存根版android.view.View中。

@hide註釋用於內部目的需要公開或受保護但不被認爲是SDK開發人員應該使用的東西。

請爲您遇到的任何問題找到其他解決方案。

+9

嗯,有趣!因此,爲了解釋理由:「我們無法理清適當的封裝,所以我們顛覆了語言。」... – 2011-02-06 21:53:02

5

這非常直截了當:注意這些變量上方的@hide註釋。 這是一個特定於Android的註釋,它隱藏了公共SDK中的字段/方法。這就是爲什麼你無法直接訪問它們的原因。

Romain Guy mentioned it in此主題。

4

你可以嘗試用反射設置字段:

import java.lang.reflect.Field; 

// ... 

try { 
    Field scrollXField = View.class.getDeclaredField("mScrollX"); 
    scrollXField.setAccessible(true); 
    scrollXField.set(this, myNewValue); 
} catch (Exception ex) { 
    // oops, android changed the implementation. sucks to be you. 
} 

但是請注意,您所依靠無證和不支持的行爲,當你這樣做,所以你要的東西打破準備在某些設備上或將來的版本中。