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.

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.

  • Sube la imagen de android a java servlet y guárdala
  • Inicie sesión en facebook en android utilizando REST API
  • ¿Cómo usar WeakReference en el desarrollo de Java y Android?
  • Android ACTION_IMAGE_CAPTURE a veces no llama aActivityResult
  • Java equivalente a printf ("% *. * F")
  • Instancias android.os.StrictMode = 2; Límite = 1
  • Comportamiento extraño con selectAllOnFocus cuando EditText está en ListView
  • Acceder a los campos singleton mediante un método estático
  • poner pestañas en la parte inferior de la pantalla
  • Asignación externa demasiado grande para este proceso
  • Android: "Actualizar automáticamente" después de un tiempo determinado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.