Mam Activity
3 EditText
s i niestandardowy widok, który działa na specjalnej klawiaturze, aby dodać informacje do EditText
s.
Obecnie przechodzę Activity
do widoku, aby uzyskać aktualnie skoncentrowany tekst edycji i zaktualizować zawartość z niestandardowej klawiatury.
Czy istnieje sposób odwoływania się do działania nadrzędnego i uzyskiwania aktualnie skoncentrowanego EditText
bez przekazywania działania do widoku?
Odpowiedzi:
Właśnie ściągnąłem ten kod źródłowy z MediaRoutera w oficjalnej bibliotece wsparcia i jak dotąd działa dobrze:
źródło
następujące metody mogą ci pomóc
Activity host = (Activity) view.getContext()
; iview.isFocused()
źródło
getContext()
nie zawsze może zwrócić obiekt Activity, jeśli Twój Widok nie jest wywoływany z kontekstu Activity. Zaplanuj to z wyprzedzeniem i zapewnij odpowiednią rezerwę.ContextThemeWrapper
sięActivity
rzuciClassCastException
. Potrzebny byłby sposób na rozpakowanie podstawowego kontekstu (który powinien być działaniem), co samo w sobie jest niebezpieczne, ponieważ istnieje natywna wersja v7ContextThemeWrapper
.Podoba mi się to rozwiązanie napisane w Kotlinie
Zastosowanie w
View
klasieKod zdekompilowany:
źródło
Wziąłem Gomino „s odpowiedź i modyfikować ją idealnie dopasować się myUtils.java więc mogę go używać wszędzie tam, gdzie i kiedy muszę. Mam nadzieję, że ktoś uzna to za pomocne :)
źródło
W Androidzie 7+ widok nie ma już dostępu do zamykającej aktywności, więc
view.getContext()
nie można jej już przesyłać do działania.Zamiast tego poniższy kod działa w systemach Android 7+ i 6:
źródło
getContext
prawdopodobnie zwróci a,ContextThemeWrapper
aby Widok nie miał już bezpośredniego dostępu do działania. Zamiast tego musisz rekurencyjnie przeszukiwać konteksty nadrzędne, dopóki nie znajdziesz działania nadrzędnego lub skorzystaj z metody podanej w tej odpowiedzi.Właściwość rozszerzenia Kotlin dla widoku w celu pobrania aktywności nadrzędnej:
źródło
if
zwhen
orazisInstance()
z!is ContextWrapper
lubis Activity
@Override public boolean shouldOverrideUrlLoading (widok WebView, żądanie WebResourceRequest) {if (request.getUrl (). GetHost (). ()); view.getContext (). startActivity (intent); zwróć prawdę; } ... ...}
źródło