Como descobrir qual vista está focada?

87

Preciso descobrir se alguma visão está focada dentro de uma atividade e qual é. Como fazer isso?

Ponto fixo
fonte

Respostas:

114

Ligue getCurrentFocus()para a atividade.

Karan
fonte
Por algum motivo, ele retorna nulo após o ciclo de todas as visualizações filhas com a ação "próxima".
WindRider
10
BTW, getCurrentFocus () é um método de atividade, não de visão.
ToolmakerSteve
3
... então, em fragmentos, podemos usar getActivity (). getCurrentFocus (). clearFocus () por exemplo ...
Martin Pfeffer
É possível obter uma atividade de hospedagem a partir de uma visualização e chamada getCurrentFocus(), mas não tão confiável.
Eido95
kotlin: no fragmento -activity?.currentFocus
Mohammad Reza Khahani
12

Da fonte de atividade:

   /**
     * 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
fonte
6

por algum motivo, o método getCurrentFocus () não está mais disponível; provavelmente já está obsoleto, aqui está a alternativa de trabalho:

View focusedView = (View) yourParentView.getFocusedChild();
John F
fonte
1
São dois métodos diferentes. getCurrentFocus () é um método da classe Activity e getFocusedChild () pertence à classe View
BoredT
2
@BoredT: getFocusedChild()é um método ativado ViewGroup.
gnuf
5

Tente fazer isso, coloque tudo dentro de um threade imprima o id e o nome da classe ao vivo logcat. Basta colocar este código dentro do seu Activity, no onCreatemétodo e depois olhar para o seu logcatpara ver o que está focado no momento.

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()

Esteja ciente de que este thread é executado em um ciclo de 100ms para não sobrecarregar a CPU com trabalho desnecessário.

Haroun Hajem
fonte
2

se você estiver em um fragmento, você pode usar

getView().findFocus()
Pablo Johnson
fonte
1

ViewGroup tem um método bastante conveniente para recuperar o filho em foco:

ViewGroup.getFocusedChild()
Rampas
fonte