如何从视图中获得托管活动?

我有一个带有3个__abc1的Activity和一个自定义视图,该视图充当专门的键盘,将信息添加到__abc1中。

目前,我正在将Activity传递到视图中,以便我可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。

是否有一种方法可以引用父活动并获得当前关注的EditText,而不将活动传递到视图?

103738 次浏览

以下方法可能对你有帮助

  1. Activity host = (Activity) view.getContext();而且
  2. view.isFocused()

我刚刚从官方支持库中的MediaRouter中提取了源代码,到目前为止它工作得很好:

private Activity getActivity() {
Context context = 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();
}

我把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;
}
}

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
}
}

更新

tailrec fun Context.getActivity(): Activity? = this as? Activity
?: (this as? ContextWrapper)?.baseContext?.getActivity()

感谢@Westy92

用法:

context.getActivity()
< p > @Override 公共布尔shouldOverrideUrlLoading(WebView视图,WebResourceRequest请求){ 如果(request.getUrl () .getHost () .startsWith(“pay.google.com”)){ 意图意图=新的意图(意图。ACTION_VIEW request.getUrl ()); view.getContext () .startActivity(意图); 返回true; } ... ... } < / p >

只是要注意,如果你知道你的视图在Fragment中,你可以这样做:

FragmentManager.findFragment(this).getActivity();

从你的onAttachedToWindowonDraw调用它,你不能更早地调用它(例如onFinishInflate),否则你会得到一个异常。

如果你不确定你的视图在Fragment中,那么参考其他答案,例如Gomino,只是想把它扔在那里。