Comment savoir quelle vue est focalisée?

87

J'ai besoin de savoir si une vue est focalisée dans une activité et de quelle vue il s'agit. Comment faire cela?

Point fixe
la source

Réponses:

114

Appelez getCurrentFocus()l'activité.

Karan
la source
Pour une raison quelconque, il retourne null après avoir parcouru toutes les vues enfants avec l'action "suivante".
WindRider
10
BTW, getCurrentFocus () est une méthode d'activité, pas de vue.
ToolmakerSteve
3
... donc dans les fragments, nous pouvons utiliser getActivity (). getCurrentFocus (). clearFocus () par exemple ..
Martin Pfeffer
Il est possible d' obtenir une activité d'hébergement à partir d'une vue et d'appeler getCurrentFocus(), mais pas si fiable.
Eido95 du
kotlin: in fragment -activity?.currentFocus
Mohammad Reza Khahani
12

De la source de l'activité:

   /**
     * 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
la source
6

pour une raison quelconque, la méthode getCurrentFocus () n'est plus disponible; probablement déjà obsolète, voici l'alternative de travail:

View focusedView = (View) yourParentView.getFocusedChild();
John F
la source
1
Ce sont deux méthodes différentes. getCurrentFocus () est une méthode de classe Activity et getFocusedChild () appartient à la classe View
BoredT
2
@BoredT: getFocusedChild()est une méthode sur ViewGroup.
gnuf
5

Essayez plutôt ceci, mettez tout dans un threadet affichez l' ID et le nom de la classe en direct logcat. Mettez simplement ce code dans votre Activity, dans la onCreateméthode, puis regardez dans votre logcatpour voir ce qui est actuellement ciblé.

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

Sachez que ce thread s'exécute dans un cycle de 100 ms afin qu'il ne déborde pas le processeur avec un travail inutile.

Haroun Hajem
la source
2

si vous êtes dans un fragment, vous pouvez utiliser

getView().findFocus()
Pablo Johnson
la source
1

ViewGroup a une méthode assez pratique pour récupérer un enfant focalisé:

ViewGroup.getFocusedChild()
Rampes
la source