Campos protegidos no visibles para las subclases
Estoy escribiendo una vista personalizada que extiende directamente android.view.View
. Si intento acceder a los campos mScrollX
o mScrollY
, veo un error de que el campo "no se puede resolver o no es un campo". El código fuente de android.view.View tiene mScrollX, mScrollY y variables similares declaradas protected
. ¿Cómo es que mi subclase directa no puede acceder a los campos protegidos de su clase padre? (Clases como ScrollView aparentemente pueden.)
PS Me doy cuenta de que puedo llamar a getScrollX()
, pero quiero actualizar estos campos; llamar a setScroll()
tiene efectos secundarios que no quiero.
- devolución de llamada de intención de difusión: result = CANCELED forIntent
- Obtener un inflador de diseño desde el ApplicationContext
- ¿Cómo obtener registros de otras aplicaciones?
- Posible motivo de "Error: no se pueden generar carpetas de vista java.lang.NullPointerException"
- Android Start_redeliver_intent tarda mucho tiempo (horas) en reiniciar el servicio
- SDK Manager.exe no funciona
- Cómo asignar accesos directos manuales en Eclipse (Android y Java)
- GreenDao getter para entidades relacionadas devuelve lista vacía
- Android: acelerar la transición de elementos compartidos entre actividades
- ¿Cómo generar la misma clave AES en Java (Android) como en .Net?
- ¿Cómo decirle a ProGuard que ofusque métodos y nombres de clase?
- 'Debe sustituir un método de superclase' Errores después de importar un proyecto en Eclipse
- ¿Cómo puedo forzar el método onPrepareOptionsMenu para disparar?
Es porque no son parte del SDK de Android.
Aquí está el código fuente de mScrollX
:
/** * The offset, in pixels, by which the content of this view is scrolled * horizontally. * {@hide} */ @ViewDebug.ExportedProperty(category = "scrolling") protected int mScrollX;
Notará la anotación @hide
. Eso significa que esto no es parte del SDK de Android. La parte del proceso de creación que crea el SDK de Android no incluirá a este miembro de datos en la edición de stub de android.view.View
que está en el archivo android.jar
que está compilando.
La anotación @hide
se utiliza para las cosas que para fines internos necesitan ser públicas o protegidas, pero no se consideran algo que los desarrolladores de SDK deben usar.
Encuentre otras soluciones para cualquier problema que esté experimentando.
Es muy sencillo: observe la anotación @hide sobre estas variables. Es una anotación específica de Android que oculta los campos / métodos del SDK público. Es por eso que no puede acceder a ellos directamente.
Romain Guy lo mencionó en este post.
Usted podría intentar establecer los campos con la reflexión:
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. }
Tenga en cuenta, sin embargo, que está confiando en el comportamiento indocumentado y no soportado cuando hace esto, por lo que debe estar preparado para que las cosas se rompan en algunos dispositivos o en futuras versiones.