我有一个活动3 EditTexts和一个自定义视图,它作为一个专门的键盘添加信息到EditTexts。
目前,我正在将Activity传递到视图中,这样我就可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。
是否有一种方法可以引用父活动并在不将活动传递到视图的情况下获得当前关注的EditText ?
我有一个活动3 EditTexts和一个自定义视图,它作为一个专门的键盘添加信息到EditTexts。
目前,我正在将Activity传递到视图中,这样我就可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。
是否有一种方法可以引用父活动并在不将活动传递到视图的情况下获得当前关注的EditText ?
当前回答
只是想要注意,如果你知道你的视图在一个片段中,你可以这样做:
FragmentManager.findFragment(this).getActivity();
从你的onAttachedToWindow或onDraw调用它,你不能更早地调用它(例如onfinishinflation),否则你会得到一个异常。
如果你不确定你的视图在Fragment中,那么参考其他答案,例如Gomino,只是想把它扔出去。
其他回答
在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
}
}
只是想要注意,如果你知道你的视图在一个片段中,你可以这样做:
FragmentManager.findFragment(this).getActivity();
从你的onAttachedToWindow或onDraw调用它,你不能更早地调用它(例如onfinishinflation),否则你会得到一个异常。
如果你不确定你的视图在Fragment中,那么参考其他答案,例如Gomino,只是想把它扔出去。
更新
tailrec fun Context.getActivity(): Activity? = this as? Activity
?: (this as? ContextWrapper)?.baseContext?.getActivity()
感谢@Westy92
用法:
context.getActivity()