¿Cómo saber qué vista está enfocada?


87

Necesito averiguar si alguna vista está enfocada dentro de una actividad y qué vista es. ¿Como hacer esto?

Respuestas:


114

Llame getCurrentFocus()a la Actividad.


Por alguna razón, devuelve un valor nulo después de ciclar todas las vistas secundarias con la acción "siguiente".
WindRider

10
Por cierto, getCurrentFocus () es un método de actividad, no de vista.
ToolmakerSteve

3
... entonces en fragmentos podemos usar getActivity (). getCurrentFocus (). clearFocus () eg ..
Martin Pfeffer

Es posible obtener la actividad de alojamiento desde una vista y una llamada getCurrentFocus(), pero no es tan confiable.
Eido95

kotlin: en fragmento -activity?.currentFocus
Mohammad Reza Khahani

12

De la fuente de actividad:

   /**
     * Calls {@link android.view.Window#getCurrentFocus} on the
     * Window of this Activity to return the currently focused view.
     * 
     * @return View The current View with focus or null.
     * 
     * @see #getWindow
     * @see android.view.Window#getCurrentFocus
     */
    public View getCurrentFocus() {
        return mWindow != null ? mWindow.getCurrentFocus() : null;
    }

6

por alguna razón, el método getCurrentFocus () ya no está disponible; probablemente ya esté en desuso, aquí la alternativa de trabajo:

View focusedView = (View) yourParentView.getFocusedChild();

1
Son dos métodos diferentes. getCurrentFocus () es un método de clase de actividad y getFocusedChild () pertenece a la clase View
BoredT

2
@BoredT: getFocusedChild()es un método de ViewGroup.
gnuf

5

En su lugar, intente esto, coloque todo dentro de threade imprima la identificación y el nombre de clase en vivo logcat. Simplemente coloque este código dentro de su Activity, en el onCreatemétodo, luego mire en su logcatpara ver qué está enfocado actualmente.

JAVA

  new Thread(() -> {
        int oldId = -1;
        while (true) {
            View newView= this.getCurrentFocus();
            if (newView!= null && newView.getId() != oldId) {
                oldId = view.getId();
                String idName = "";
                try {
                   idName = getResources().getResourceEntryName(newView.getId());
                 } catch (Resources.NotFoundException e) {
                   idName = String.valueOf(newView.getId());
                 }
                Log.i(TAG, "Focused Id: " + idName + " Class: " + newView.getClass());
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

KOTLIN

      Thread(Runnable {
            var oldId = -1
            while (true) {
                val newView: View? = this.currentFocus
                if (newView != null && newView.id != oldId) {
                    oldId = newView.id
                    var idName: String = try {
                        resources.getResourceEntryName(newView.id)
                    } catch (e: Resources.NotFoundException) {
                        newView.id.toString()
                    }
                    Log.i(TAG, "Focused Id: " + idName + " Class: " + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

Tenga en cuenta que este hilo se ejecuta en un ciclo de 100 ms para que no desborde la CPU con trabajo innecesario.



1

ViewGroup tiene un método bastante conveniente para recuperar el niño enfocado:

ViewGroup.getFocusedChild()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.