我有一个活动3 EditTexts和一个自定义视图,它作为一个专门的键盘添加信息到EditTexts。
目前,我正在将Activity传递到视图中,这样我就可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。
是否有一种方法可以引用父活动并在不将活动传递到视图的情况下获得当前关注的EditText ?
我有一个活动3 EditTexts和一个自定义视图,它作为一个专门的键盘添加信息到EditTexts。
目前,我正在将Activity传递到视图中,这样我就可以获得当前聚焦的编辑文本,并从自定义键盘更新内容。
是否有一种方法可以引用父活动并在不将活动传递到视图的情况下获得当前关注的EditText ?
当前回答
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
}
}
其他回答
以下方法可能对你有帮助
Activity host = (Activity) view.getContext();而且 view.isFocused ()
在使用它之前,你应该首先检查它是否是一个Activity:
if (view.getContext() instanceof Activity){
Activity host = (Activity) view.getContext();
//do something with host now
}
我把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
}
}
我只是从官方支持库中的MediaRouter中提取了源代码,到目前为止它工作得很好:
private Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
@Override 公共布尔shouldOverrideUrlLoading(WebView视图,WebResourceRequest请求){ 如果(request.getUrl () .getHost () .startsWith(“pay.google.com”)){ 意图意图=新的意图(意图。ACTION_VIEW request.getUrl ()); view.getContext () .startActivity(意图); 返回true; } ... ... }