Función onFocusChanged de Android nunca llamada

He creado un botón personalizado en extender la clase de View como se especifica en este tutorial:

[Android] Making a custom Android button using a custom view

Pero tengo un problema con la función onFocusChanged() que nunca se llama.

Este es mi código:

 public class CustomButton extends View { ... public CustomButton(Context context, Car car) { super(context); setFocusable(true); setBackgroundColor(Color.BLACK); setOnClickListener(listenerAdapter); setClickable(true); } @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { if (gainFocus == true) { this.setBackgroundColor(Color.rgb(255, 165, 0)); } else { this.setBackgroundColor(Color.BLACK); } } ... } 

De hecho, cuando hago clic en mi botón personalizado nada pasa … Con el depurador, puedo ver que la función nunca se llama. Y no sé por qué.

Entonces, ¿había olvidado un paso? ¿Hay otra cosa que he perdido?

De hecho, el problema era que no he fijado la característica "focusable en modo del tacto" de mi botón de encargo a la verdad. He agregado en el constructor setFocusableInTouchMode(true); Y funciona mejor. Gracias Phil y Vicki D por su ayuda.

 public class CustomButton extends View { ... public CustomButton(Context context, Car car) { super(context); setFocusable(true); setFocusableInTouchMode(true); // Needed to call onFocusChanged() setBackgroundColor(Color.BLACK); setOnClickListener(listenerAdapter); setClickable(true); } @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { if (gainFocus == true) { this.setBackgroundColor(Color.rgb(255, 165, 0)); } else { this.setBackgroundColor(Color.BLACK); } super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); } ... } 

Los documentos dicen: "Cuando se sobreponga, asegúrese de llamar a través de la clase super para que el manejo de enfoque estándar se produzca." Ha omitido esa llamada en su código anterior, algo como lo siguiente debe ayudar.

 @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { if (gainFocus == true) { this.setBackgroundColor(Color.rgb(255, 165, 0)); } else { this.setBackgroundColor(Color.BLACK); } super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); } 

Debe setOnFocusChangeListener en su constructor. algo como esto:

  public CustomButton(Context context, Car car) { ... setOnFocusChangeListener(this); ... } 
  • Se muere la conexión de servicio XMPP
  • ¿Cómo obtener las claves de ContentValues?
  • Resto objeto POST utilizando el resorte para android
  • SQLite de Android Cursor fuera de límites de excepción en SELECT count (*) FROM table
  • No se pueden cargar archivos de biblioteca .so al hacer una aplicación de sistema
  • Bola de rebote de Android
  • Cargando imágenes grandes sin OutOfMemoryError
  • DoubleClick for Publishers en Google Play Services causa NullPointerException en 4.2.2
  • Android - ¿Está bien poner valores @IntDef dentro de @interface?
  • EditText leftView image se ajustan al tamaño del EditText Android
  • Observable / Observador Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.