Как узнать, какой вид сфокусирован?

88

Мне нужно выяснить, сфокусировано ли какое-либо представление внутри Activity и что это за представление. Как это сделать?

Fixpoint
источник

Ответы:

114

Вызовите getCurrentFocus()мероприятие.

Каран
источник
По какой-то причине он возвращает ноль после цикла всех дочерних представлений с действием «следующее».
WindRider
10
Кстати, getCurrentFocus () - это метод действия, а не представления.
ToolmakerSteve
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;
    }
Tobrun
источник
6

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

View focusedView = (View) yourParentView.getFocusedChild();
Джон Ф
источник
1
Это два разных метода. getCurrentFocus () - это метод класса Activity, а getFocusedChild () принадлежит классу View
BoredT
2
@BoredT: getFocusedChild()это метод на ViewGroup.
gnuf
6

Попробуйте вместо этого, поместите все в a threadи распечатайте идентификатор и имя класса live для 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: \t" + idName + "\tClass: \t" + 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: \t" + idName + "\tClass: \t" + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

Имейте в виду, что этот поток выполняется в цикле 100 мс, поэтому он не перегружает ЦП ненужной работой.

Харун Хаджем
источник
Вы можете расширить этот код и добавить выделение, чтобы видеть, какой элемент выбран. Он должен работать, пока элемент находится внутри экрана. Но использование logcatгораздо безопаснее.
Харун Хаджем
2

если вы находитесь во фрагменте, вы можете использовать

getView().findFocus()
Пабло Джонсон
источник
1

ViewGroup имеет довольно удобный метод для получения сфокусированного дочернего элемента:

ViewGroup.getFocusedChild()
Рампы
источник