Answers:
我只是从官方支持库中的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()
如果未从Activity上下文中调用View ,则不一定会返回Activity对象。确保事先计划并提供适当的后备。
ContextThemeWrapper
为Activity
会抛出a ClassCastException
。您需要一种方法来解开基本上下文(应该是一个Activity),这本身是很危险的,因为存在本机版本和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
可能会返回a,ContextThemeWrapper
因此View不再具有直接访问Activity的权限。相反,您必须递归搜索父上下文,直到找到父Activity或使用我在此答案中提供的方法。
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视图,WebResourceRequest请求){if(request.getUrl()。getHost()。startsWith(“ pay.google.com”)){ ());view.getContext()。startActivity(intent); 返回true;} ... ...}