¿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.