답변:
방금 공식 지원 라이브러리 의 MediaRouter에서 해당 소스 코드를 가져 와서 잘 작동했습니다.
private Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
다음 방법이 도움이 될 수 있습니다
Activity host = (Activity) view.getContext()
; 과view.isFocused()
getContext()
뷰가 액티비티 컨텍스트에서 호출되지 않은 경우 항상 액티비티 객체를 반환 하지 않을 수도 있습니다. 미리 계획하고 적절한 폴백을 제공하십시오.
ContextThemeWrapper
할 Activity
발생합니다 ClassCastException
. 기본 컨텍스트 (액션이어야 함)의 랩을 해제하는 방법이 필요합니다. 기본 컨텍스트는 v7 버전이므로 기본적으로 위험 ContextThemeWrapper
합니다.
나는 Kotlin으로 작성된이 솔루션을 좋아합니다.
tailrec fun Context?.activity(): Activity? = when (this) {
is Activity -> this
else -> (this as? ContextWrapper)?.baseContext?.activity()
}
View
수업 에서의 사용법
context.activity()
디 컴파일 된 코드 :
public static final Activity activity(Context context) {
while (!(context instanceof Activity)) {
if (!(context instanceof ContextWrapper)) {
context = null;
}
ContextWrapper contextWrapper = (ContextWrapper) context;
if (contextWrapper == null) {
return null;
}
context = contextWrapper.getBaseContext();
if (context == null) {
return null;
}
}
return (Activity) context;
}
Gomino 의 대답을 취하여 myUtils.java 에 완벽하게 맞게 수정하여 필요할 때마다 사용할 수 있습니다. 누군가가 도움이되기를 바랍니다 :)
abstract class myUtils {
public static Activity getActivity(View view) {
Context context = view.getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
}
Android 7 이상에서는 뷰가 더 이상 엔 클로징 활동에 액세스 할 view.getContext()
수 없으므로 더 이상 활동으로 캐스트 할 수 없습니다.
대신 아래 코드는 Android 7 이상 및 6에서 작동합니다.
private static Activity getActivity(final View view) {
return (Activity) view.findViewById(android.R.id.content).getContext();
}
getContext
는 아마도 ContextThemeWrapper
뷰가 더 이상 활동에 직접 액세스 할 수 없도록 a를 반환합니다 . 대신 부모 활동을 찾거 나이 답변에서 제공 한 방법을 사용할 때까지 부모 컨텍스트를 반복적으로 검색해야합니다.
부모 활동을 검색하기위한 View의 Kotlin 확장 등록 정보 :
val View.activity: Activity?
get() {
var ctx = context
while (true) {
if (!ContextWrapper::class.java.isInstance(ctx)) {
return null
}
if (Activity::class.java.isInstance(ctx)) {
return ctx as Activity
}
ctx = (ctx as ContextWrapper).baseContext
}
}
if
와 when
와 isInstance()
와 !is ContextWrapper
나is Activity
@Override public boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request) {if (request.getUrl (). getHost (). startsWith ( "pay.google.com")) {의도 의도 = 새로운 의도 (Intent.ACTION_VIEW, request.getUrl ()); view.getContext (). startActivity (intent); true를 반환; } ... ...}