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

Punto fijo
fuente

Respuestas:

114

Llame getCurrentFocus()a la Actividad.

Karan
fuente
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;
    }
Tobrun
fuente
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();
Juan F
fuente
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.

Haroun Hajem
fuente
2

si estás en un fragmento puedes usar

getView().findFocus()
Pablo Johnson
fuente
1

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

ViewGroup.getFocusedChild()
Rampas
fuente