How to find out which view is focused?
Asked Answered
A

6

113

I need to find out if any view is focused inside an Activity and what view it is. How to do this?

Assignable answered 18/3, 2011 at 12:51 Comment(0)
B
137

Call getCurrentFocus() on the Activity.

Buccinator answered 18/3, 2011 at 12:55 Comment(6)
For some reason it returns null after cycling all child views with "next" action.Axle
BTW, getCurrentFocus() is a method of activity, not of view.Cathe
... so in fragments we can use getActivity().getCurrentFocus().clearFocus() e.g...Gaven
It is possible to get hosting Activity from a View and call getCurrentFocus(), but not that reliable.Stash
kotlin: in fragment - activity?.currentFocusUitlander
From view: (v.context as? Activity)?.currentFocus.Hardan
F
13

From the source of Activity:

   /**
     * 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;
    }
Frequentation answered 10/1, 2014 at 11:50 Comment(0)
S
13

Try this instead, put everything inside a thread and print the id and classname live to logcat. Just put this code inside your Activity, in the onCreate method then look into your logcat to see what is currently focused.

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

Be aware this thread runs in a 100ms cycle so it doesn't overflow the CPU with unnecessary work.

Schaub answered 19/9, 2018 at 20:44 Comment(1)
You could extend this code and add a highlight so you can see which item is selected. It should work as long the item is inside the screen. But using the logcat is much more secure.Schaub
C
10

if you are in a fragment you can use

getView().findFocus()
Circumfuse answered 21/3, 2018 at 23:49 Comment(0)
F
6

for some reason getCurrentFocus() method isn't available anymore; probably it's deprecated already, here the working alternative:

View focusedView = (View) yourParentView.getFocusedChild();
Florez answered 3/9, 2014 at 6:10 Comment(2)
It is two different methods. getCurrentFocus() is an Activity class method and getFocusedChild() belongs to View classMargarite
@BoredT: getFocusedChild() is a method on ViewGroup.Driedup
B
1

ViewGroup has quite convenient method for retrieving focused child:

ViewGroup.getFocusedChild()
Burger answered 1/8, 2018 at 9:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.