J'ai besoin de savoir si une vue est focalisée dans une activité et de quelle vue il s'agit. Comment faire cela?
J'ai besoin de savoir si une vue est focalisée dans une activité et de quelle vue il s'agit. Comment faire cela?
Réponses:
Appelez getCurrentFocus()l'activité.
getCurrentFocus(), mais pas si fiable.
activity?.currentFocus
De la source de l'activité:
/**
* 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;
}
pour une raison quelconque, la méthode getCurrentFocus () n'est plus disponible; probablement déjà obsolète, voici l'alternative de travail:
View focusedView = (View) yourParentView.getFocusedChild();
getFocusedChild()est une méthode sur ViewGroup.
Essayez plutôt ceci, mettez tout dans un threadet affichez l' ID et le nom de la classe en direct logcat. Mettez simplement ce code dans votre Activity, dans la onCreateméthode, puis regardez dans votre logcatpour voir ce qui est actuellement ciblé.
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()
Sachez que ce thread s'exécute dans un cycle de 100 ms afin qu'il ne déborde pas le processeur avec un travail inutile.
si vous êtes dans un fragment, vous pouvez utiliser
getView().findFocus()