android 如何从视图中获取托管Activity?

sqserrrh  于 2023-02-06  发布在  Android
关注(0)|答案(8)|浏览(139)

我有一个带有3个EditTextActivity和一个自定义视图,该视图充当一个专门的键盘来向EditText添加信息。
目前,我正在将Activity传递到视图中,以便可以获得当前焦点编辑文本并从自定义键盘更新内容。
是否有一种方法可以引用父活动并获取当前焦点EditText,而无需将活动传递到视图中?

csbfibhn

csbfibhn1#

我刚刚从官方支持库中的MediaRouter中提取了该源代码,到目前为止它运行良好:

private Activity getActivity() {
    Context context = getContext();
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) {
            return (Activity)context;
        }
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null;
}
7hiiyaii

7hiiyaii2#

以下方法可能对您有所帮助

  1. Activity host = (Activity) view.getContext();以及
  2. view.isFocused()
    在使用它之前,您至少应该检查它是否是“活动”:
if (view.getContext() instanceof Activity){
     Activity host = (Activity) view.getContext();
     //do something with host now
}
inkz8wg9

inkz8wg93#

    • 已更新**
tailrec fun Context.getActivity(): Activity? = this as? Activity
    ?: (this as? ContextWrapper)?.baseContext?.getActivity()

感谢@Westy92
用法:

context.getActivity()
y3bcpkx1

y3bcpkx14#

我取了Gominoanswer,并将其修改为完全适合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;
    }
}
aij0ehis

aij0ehis5#

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

FragmentManager.findFragment(this).getActivity();

从你的onAttachedToWindowonDraw调用它,你不能提前调用它(例如onFinishInflate),否则你会得到一个异常。
如果您不确定您的视图是否在Fragment内部,请参考其他答案,例如Gomino,只是想将其抛出。

noj0wjuj

noj0wjuj6#

用于检索父活动的视图的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
    }
}
k97glaaz

k97glaaz7#

在Android 7+中,视图不再具有对包含Activity的访问权限,因此view.getContext()无法再强制转换为Activity。
相反,以下代码适用于Android 7+和6:

private static Activity getActivity(final View view) {
    return (Activity) view.findViewById(android.R.id.content).getContext();
}
wlzqhblo

wlzqhblo8#

@Override公共布尔值shouldOverrideUrlLoading(网络视图视图,网络资源请求请求){if(请求. getUrl(). getHost(). startsWith("www.example.com")){Intent意图=新Intent(意图.动作视图,请求. getUrl());pay.google.com返回真;...... return true; } ... ... }

相关问题