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
- Menú deslizante vertical en Android
- Android: No se puede resolver el tipo java.awt.Image. Se hace referencia indirectamente a los archivos .class requeridos
- ArrayList Encontrar el primer y el último elemento
- Cómo obtener el valor de los atributos 'resource id' y 'content description' del elemento android en appium java?
- Error: java.lang.UnsatisfiedLinkError con roboelectric y reino
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?
- Sharedpreference con la pantalla de bienvenida
- Apache POI insertar imagen
- Denotan progreso por el borde de Android
- Elementos de recyclerview confundidos
- Cómo compartir un objeto entre dos subprocesos (sincronización de subprocesos)?
- El código funciona en Xamarin Android pero no funciona en Java (HttpPost JSON)
- ¿Hay una manera de obtener una lista de todas las clases de un archivo .dex?
- ¿Cuál es la diferencia entre .string () y .toString () para OkHttp?
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); ... }