답변:
방금 공식 지원 라이브러리 의 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를 반환; } ... ...}