Wie finde ich heraus, welche Ansicht fokussiert ist?

86

Ich muss herausfinden, ob eine Ansicht innerhalb einer Aktivität fokussiert ist und welche Ansicht es ist. Wie macht man das?

Fixpunkt
quelle

Antworten:

113

Rufen Sie getCurrentFocus()die Aktivität auf.

Karan
quelle
Aus irgendeinem Grund wird null zurückgegeben, nachdem alle untergeordneten Ansichten mit der Aktion "Weiter" durchlaufen wurden.
WindRider
10
Übrigens ist getCurrentFocus () eine Methode der Aktivität, nicht der Ansicht.
ToolmakerSteve
3
... also können wir in Fragmenten getActivity (). getCurrentFocus (). clearFocus () verwenden, zB ..
Martin Pfeffer
Es ist möglich , Hosting-Aktivitäten aus einer Ansicht und einem Anruf abzurufen getCurrentFocus(), aber nicht so zuverlässig.
Eido95
Kotlin: in Fragment -activity?.currentFocus
Mohammad Reza Khahani
12

Aus der Quelle der Aktivität:

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

Aus irgendeinem Grund ist die Methode getCurrentFocus () nicht mehr verfügbar. wahrscheinlich ist es schon veraltet, hier die funktionierende Alternative:

View focusedView = (View) yourParentView.getFocusedChild();
John F.
quelle
1
Es gibt zwei verschiedene Methoden. getCurrentFocus () ist eine Aktivitätsklassenmethode und getFocusedChild () gehört zur View-Klasse
BoredT
2
@BoredT: getFocusedChild()ist eine Methode auf ViewGroup.
Gnuf
5

Versuchen Sie dies stattdessen, setzen Sie alles in ein threadund drucken Sie die ID und den Klassennamen live aus logcat. Diesen Code einfach in Ihrem setzen Activity, in dem onCreateVerfahren dann schauen Sie in , logcatum zu sehen , was aktuell ist konzentriert.

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

Beachten Sie, dass dieser Thread in einem 100-ms-Zyklus ausgeführt wird, damit die CPU nicht mit unnötiger Arbeit überfüllt wird.

Haroun Hajem
quelle
1

Wenn Sie sich in einem Fragment befinden, können Sie verwenden

getView().findFocus()
Pablo Johnson
quelle
1

ViewGroup bietet eine sehr bequeme Methode zum Abrufen eines fokussierten Kindes:

ViewGroup.getFocusedChild()
Rampen
quelle