Як дізнатися, який погляд сфокусований?


87

Мені потрібно з’ясувати, чи фокусується якийсь погляд всередині діяльності та який це вид. Як це зробити?

Відповіді:


114

Зателефонуйте getCurrentFocus()до Діяльності.


З якихось причин він повертає значення null після перемикання всіх дочірніх поглядів дією "next".
WindRider

10
До речі, getCurrentFocus () - це метод діяльності, а не зору.
Виробник інструментів,

3
... тому у фрагментах ми можемо використовувати getActivity (). getCurrentFocus (). clearFocus () напр ..
Мартін Пфеффер

Отримати хостингову активність із подання та дзвінка можна getCurrentFocus(), але не настільки надійно.
Eido95,

kotlin: у фрагменті -activity?.currentFocus
Мохаммад Реза Хахані

12

Від джерела Діяльності:

   /**
     * 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;
    }

6

з якихось причин метод getCurrentFocus () більше не доступний; можливо, це вже застаріло, тут працює альтернатива:

View focusedView = (View) yourParentView.getFocusedChild();

1
Це два різні методи. getCurrentFocus () - метод класу активності, і getFocusedChild () належить до класу View
BoredT

2
@BoredT: getFocusedChild()це метод на ViewGroup.
gnuf

5

Спробуйте замість цього, помістіть все всередину а threadі надрукуйте ідентифікатор та ім'я класу в прямому ефірі logcat. Просто помістіть цей код всередині вашого Activity, в onCreateметоді потім подивитися на ваш , logcatщоб дізнатися , що в даний час зосереджені.

ЯВА

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

КОТЛІН

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

Пам’ятайте, цей потік працює у циклі 100 мс, щоб не переповнювати центральний процесор зайвою роботою.



1

ViewGroup має досить зручний метод для отримання зосередженої дитини:

ViewGroup.getFocusedChild()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.