我有一个带有3个EditText的Activity和一个自定义视图,该视图充当一个专门的键盘来向EditText添加信息。目前,我正在将Activity传递到视图中,以便可以获得当前焦点编辑文本并从自定义键盘更新内容。是否有一种方法可以引用父活动并获取当前焦点EditText,而无需将活动传递到视图中?
EditText
Activity
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; }
7hiiyaii2#
以下方法可能对您有所帮助
Activity host = (Activity) view.getContext()
view.isFocused()
if (view.getContext() instanceof Activity){ Activity host = (Activity) view.getContext(); //do something with host now }
inkz8wg93#
tailrec fun Context.getActivity(): Activity? = this as? Activity ?: (this as? ContextWrapper)?.baseContext?.getActivity()
感谢@Westy92用法:
context.getActivity()
y3bcpkx14#
我取了Gomino的answer,并将其修改为完全适合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; } }
aij0ehis5#
需要注意的是,如果你知道你的视图在Fragment中,你可以做:
Fragment
FragmentManager.findFragment(this).getActivity();
从你的onAttachedToWindow或onDraw调用它,你不能提前调用它(例如onFinishInflate),否则你会得到一个异常。如果您不确定您的视图是否在Fragment内部,请参考其他答案,例如Gomino,只是想将其抛出。
onAttachedToWindow
onDraw
onFinishInflate
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 } }
k97glaaz7#
在Android 7+中,视图不再具有对包含Activity的访问权限,因此view.getContext()无法再强制转换为Activity。相反,以下代码适用于Android 7+和6:
view.getContext()
private static Activity getActivity(final View view) { return (Activity) view.findViewById(android.R.id.content).getContext(); }
wlzqhblo8#
@Override公共布尔值shouldOverrideUrlLoading(网络视图视图,网络资源请求请求){if(请求. getUrl(). getHost(). startsWith("www.example.com")){Intent意图=新Intent(意图.动作视图,请求. getUrl());pay.google.com返回真;...... return true; } ... ... }
8条答案
按热度按时间csbfibhn1#
我刚刚从官方支持库中的MediaRouter中提取了该源代码,到目前为止它运行良好:
7hiiyaii2#
以下方法可能对您有所帮助
Activity host = (Activity) view.getContext()
;以及view.isFocused()
在使用它之前,您至少应该检查它是否是“活动”:
inkz8wg93#
感谢@Westy92
用法:
y3bcpkx14#
我取了Gomino的answer,并将其修改为完全适合myUtils.java,这样我就可以随时随地使用它。希望有人觉得它有帮助:)
aij0ehis5#
需要注意的是,如果你知道你的视图在
Fragment
中,你可以做:从你的
onAttachedToWindow
或onDraw
调用它,你不能提前调用它(例如onFinishInflate
),否则你会得到一个异常。如果您不确定您的视图是否在
Fragment
内部,请参考其他答案,例如Gomino,只是想将其抛出。noj0wjuj6#
用于检索父活动的视图的Kotlin扩展属性:
k97glaaz7#
在Android 7+中,视图不再具有对包含Activity的访问权限,因此
view.getContext()
无法再强制转换为Activity。相反,以下代码适用于Android 7+和6:
wlzqhblo8#
@Override公共布尔值shouldOverrideUrlLoading(网络视图视图,网络资源请求请求){if(请求. getUrl(). getHost(). startsWith("www.example.com")){Intent意图=新Intent(意图.动作视图,请求. getUrl());pay.google.com返回真;...... return true; } ... ... }