Ich muss herausfinden, ob eine Ansicht innerhalb einer Aktivität fokussiert ist und welche Ansicht es ist. Wie macht man das?
Antworten:
Rufen Sie getCurrentFocus()die Aktivität auf.
getCurrentFocus(), aber nicht so zuverlässig.
activity?.currentFocus
Aus der Quelle der Aktivität:
/**
* 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;
}
Aus irgendeinem Grund ist die Methode getCurrentFocus () nicht mehr verfügbar. wahrscheinlich ist es schon veraltet, hier die funktionierende Alternative:
View focusedView = (View) yourParentView.getFocusedChild();
getFocusedChild()ist eine Methode auf ViewGroup.
Versuchen Sie dies stattdessen, setzen Sie alles in ein threadund drucken Sie die ID und den Klassennamen live aus logcat. Diesen Code einfach in Ihrem setzen Activity, in dem onCreateVerfahren dann schauen Sie in , logcatum zu sehen , was aktuell ist konzentriert.
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()
Beachten Sie, dass dieser Thread in einem 100-ms-Zyklus ausgeführt wird, damit die CPU nicht mit unnötiger Arbeit überfüllt wird.
Wenn Sie sich in einem Fragment befinden, können Sie verwenden
getView().findFocus()