我有一个带有3个__abc1的Activity和一个自定义视图,该视图充当专门的键盘,将信息添加到__abc1中。
Activity
目前,我正在将Activity传递到视图中,以便我可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。
是否有一种方法可以引用父活动并获得当前关注的EditText,而不将活动传递到视图?
EditText
以下方法可能对你有帮助
Activity host = (Activity) view.getContext()
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()不能再被转换为活动。
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()
只是要注意,如果你知道你的视图在Fragment中,你可以这样做:
Fragment
FragmentManager.findFragment(this).getActivity();
从你的onAttachedToWindow或onDraw调用它,你不能更早地调用它(例如onFinishInflate),否则你会得到一个异常。
onAttachedToWindow
onDraw
onFinishInflate
如果你不确定你的视图在Fragment中,那么参考其他答案,例如Gomino,只是想把它扔在那里。