Jak dowiedzieć się, który widok jest skoncentrowany?

89

Muszę się dowiedzieć, czy jakikolwiek widok jest skoncentrowany wewnątrz działania i jaki to widok. Jak to zrobić?

Punkt stały
źródło

Odpowiedzi:

117

Zadzwoń getCurrentFocus()na zajęcia.

Karan
źródło
Z jakiegoś powodu zwraca wartość null po przełączeniu wszystkich widoków podrzędnych z akcją „next”.
WindRider
10
BTW, getCurrentFocus () jest metodą działania, a nie widoku.
ToolmakerSteve
3
... więc we fragmentach możemy użyć getActivity () getCurrentFocus () () clearFocus np ....
Martin Pfeffer
Możliwe jest pobranie aktywności hostingu z widoku i połączenia getCurrentFocus(), ale nie jest to niezawodne.
Eido95,
kotlin: we fragmencie -activity?.currentFocus
Mohammad Reza Khahani
12

Ze źródła działania:

   /**
     * 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
źródło
7

Spróbuj zamiast tego umieścić wszystko wewnątrz threadi wydrukować identyfikator i classname żyć logcat. Po prostu umieść ten kod w swoim Activity, w onCreatemetodzie, a następnie zajrzyj do swojego, logcataby zobaczyć, na czym aktualnie się skupiamy.

JAWA

  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: \t" + idName + "\tClass: \t" + 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: \t" + idName + "\tClass: \t" + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

Należy pamiętać, że ten wątek działa w cyklu 100 ms, więc nie przepełnia procesora niepotrzebną pracą.

Haroun Hajem
źródło
Możesz rozszerzyć ten kod i dodać wyróżnienie, aby zobaczyć, który element jest wybrany. Powinien działać tak długo, jak długo element znajduje się wewnątrz ekranu. Ale używanie logcatjest znacznie bezpieczniejsze.
Haroun Hajem
6

z jakiegoś powodu metoda getCurrentFocus () nie jest już dostępna; prawdopodobnie jest już przestarzały, tutaj działająca alternatywa:

View focusedView = (View) yourParentView.getFocusedChild();
John F.
źródło
1
To dwie różne metody. getCurrentFocus () jest metodą klasy Activity i getFocusedChild () należy do klasy View
BoredT
2
@BoredT: getFocusedChild()to metoda na ViewGroup.
gnuf
2

jeśli jesteś w fragmencie, którego możesz użyć

getView().findFocus()
Pablo Johnson
źródło
1

ViewGroup ma dość wygodną metodę odzyskiwania skoncentrowanego dziecka:

ViewGroup.getFocusedChild()
Rampy
źródło