Android从视图中获取托管活动

mAn*_*oid 174 android android-edittext android-view android-activity

我有一个Activity3 EditText秒和一个自定义视图,它作用一个专门的键盘来添加信息到EditTexts.

目前我正在将Activity视图传递给视图,以便我可以获得当前聚焦的编辑文本并更新自定义键盘中的内容.

有没有一种方法可以引用父活动并在EditText不将活动传递到视图的情况下获得当前的焦点?

Gom*_*ino 278

我刚刚从官方支持库中的MediaRouter中提取了该源代码,到目前为止它工作正常:

private Activity getActivity() {
    Context context = getContext();
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) {
            return (Activity)context;
        }
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 而?为何? (11认同)
  • 它只是一种通过所有基本上下文冒泡的方法,直到找到活动,或者在找到根上下文时退出循环.导致根上下文将具有null baseContext,从而导致循环结束. (7认同)
  • 有人忘记在这段代码中添加原始源代码中的注释“//展开 Activity 的粗略方式,以便我们可以获得 FragmentManager”;) (2认同)

dir*_*ira 167

以下方法可以帮助您

  1. Activity host = (Activity) view.getContext(); 和
  2. view.isFocused()

  • 只是不要忘记,如果没有从Activity上下文调用View,`getContext()`可能不会总是返回一个Activity对象.确保提前计划并提供适当的后备. (34认同)
  • 这是一个非常危险的演员阵容.很有可能(如果你正在使用appcompat)你所拥有的上下文被包装,将类似`ContextThemeWrapper`的内容转换为`Activity`会抛出一个`ClassCastException`.你需要一种方法来解开基础上下文(应该是一个Activity),这本身就很危险,因为有一个本地和v7版本的`ContextThemeWrapper`. (23认同)
  • gomino提供了正确的答案. (14认同)
  • @WordPressDeveloper - 在片段中创建视图时,它的上下文仍然是活动.片段只能驻留在"活动"中. (4认同)

Vla*_*lad 29

更新

tailrec fun Context.getActivity(): Activity? = this as? Activity
    ?: (this as? ContextWrapper)?.baseContext?.getActivity()
Run Code Online (Sandbox Code Playgroud)

感谢@Westy92

用法:

context.getActivity()
Run Code Online (Sandbox Code Playgroud)

  • 您还可以执行以下操作: `tailrec fun Context?.getActivity(): Activity? = 这作为?Activity ?: (这作为? ContextWrapper)?.baseContext?.getActivity()` (3认同)
  • 谢谢,非常感谢 kotlin 上这次精彩的扫描活动 (2认同)

小智 6

我接受了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;
    }
}
Run Code Online (Sandbox Code Playgroud)