我有一个活动3 EditTexts和一个自定义视图,它作为一个专门的键盘添加信息到EditTexts。

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

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


以下方法可能对你有帮助

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

在使用它之前,你应该首先检查它是否是一个Activity:

if (view.getContext() instanceof Activity){
     Activity host = (Activity) view.getContext();
     //do something with host now
}

我只是从官方支持库中的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()

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


只是想要注意,如果你知道你的视图在一个片段中,你可以这样做:

FragmentManager.findFragment(this).getActivity();

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

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