Ich habe eine Activity
mit 3 EditText
s und eine benutzerdefinierte Ansicht, die eine spezielle Tastatur zum Hinzufügen von Informationen in die EditText
s fungiert.
Derzeit übergebe ich das Activity
in die Ansicht, damit ich den aktuell fokussierten Bearbeitungstext abrufen und den Inhalt über die benutzerdefinierte Tastatur aktualisieren kann.
Gibt es eine Möglichkeit, auf die übergeordnete Aktivität zu verweisen und den aktuellen Fokus zu erhalten, EditText
ohne die Aktivität in die Ansicht zu übertragen?
Antworten:
Ich habe gerade diesen Quellcode aus dem MediaRouter in der offiziellen Support-Bibliothek abgerufen und bis jetzt funktioniert es einwandfrei :
quelle
Die folgenden Methoden können Ihnen helfen
Activity host = (Activity) view.getContext()
;; undview.isFocused()
quelle
getContext()
ein Aktivitätsobjekt möglicherweise nicht immer zurückgegeben wird, wenn Ihre Ansicht nicht aus einem Aktivitätskontext aufgerufen wird. Stellen Sie sicher, dass Sie dies im Voraus planen und einen geeigneten Fallback bereitstellen.ContextThemeWrapper
toActivity
werfen , wird ein geworfenClassCastException
. Sie benötigen eine Möglichkeit, den Basiskontext (der eine Aktivität sein sollte) zu entpacken, was an sich gefährlich ist, da es eine native und v7-Version von gibtContextThemeWrapper
.Ich mag diese in Kotlin geschriebene Lösung
Verwendung im
View
UnterrichtDekompilierter Code:
quelle
Ich nahm Gomino ‚s Antwort und modifizierte es perfekt in myUtils.java passen , damit ich sie verwenden kann , wo immer und wann immer ich brauche. Hoffe jemand findet es hilfreich :)
quelle
In Android 7+ hat die Ansicht keinen Zugriff mehr auf die umschließende Aktivität und
view.getContext()
kann daher nicht mehr in eine Aktivität umgewandelt werden.Stattdessen funktioniert der folgende Code in Android 7+ und 6:
quelle
getContext
wahrscheinlich a zurückgeben,ContextThemeWrapper
sodass die Ansicht keinen direkten Zugriff mehr auf die Aktivität hat. Stattdessen müssen Sie die übergeordneten Kontexte rekursiv durchsuchen, bis Sie die übergeordnete Aktivität gefunden haben, oder die in dieser Antwort angegebene Methode verwenden.Kotlin-Erweiterungseigenschaft für Ansicht zum Abrufen der übergeordneten Aktivität:
quelle
if
durchwhen
und dieisInstance()
mit!is ContextWrapper
oderis Activity
@Override public boolean shouldOverrideUrlLoading (WebView-Ansicht, WebResourceRequest-Anforderung) {if (request.getUrl (). GetHost (). StartsWith ("pay.google.com")) {Intent intent = new Intent (Intent.ACTION_VIEW, request.getUrl ()); view.getContext (). startActivity (intent); return true; } ... ...}
quelle