I need to find out if any view is focused inside an Activity and what view it is. How to do this?
How to find out which view is focused?
Call getCurrentFocus()
on the Activity.
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?.currentFocus
–
Uitlander From view:
(v.context as? Activity)?.currentFocus
. –
Hardan 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;
}
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.
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 if you are in a fragment you can use
getView().findFocus()
for some reason getCurrentFocus() method isn't available anymore; probably it's deprecated already, here the working alternative:
View focusedView = (View) yourParentView.getFocusedChild();
It is two different methods. getCurrentFocus() is an Activity class method and getFocusedChild() belongs to View class –
Margarite
@BoredT:
getFocusedChild()
is a method on ViewGroup
. –
Driedup ViewGroup has quite convenient method for retrieving focused child:
ViewGroup.getFocusedChild()
© 2022 - 2024 — McMap. All rights reserved.