【问题标题】:How to call getWindow() outside an Activity in Android?如何在 Android 的 Activity 之外调用 getWindow()?
【发布时间】:2020-12-15 18:33:23
【问题描述】:

我正在尝试组织我的代码并将重复的功能移动到一个类中。 这行代码在扩展活动的类中运行良好:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

但是当我尝试将它包含到外部类中时它不起作用。

如何从另一个类调用 getWindow() 以在 Activity 中应用它?

【问题讨论】:

    标签: java android


    【解决方案1】:

    您不应按照已接受答案中的建议保留参考资料。这可行,但可能会导致内存泄漏。

    从你的角度使用这个代替:

    ((Activity) getContext()).getWindow()...
    

    您的视图中有一个对您的活动的托管引用,您可以使用 getContext() 检索该引用。将其转换为 Activity 并使用 Activity 中的任何方法,例如 getWindow()。

    【讨论】:

    • 这是旧的,但值得注意的是,有两种情况不起作用。 1)当上下文是应用程序上下文时(不会发生在视图内,但很高兴知道您是否在某种实用程序类中)。 2) 有时视图上下文会解析为 ContextThemeWrapper 而不是活动。我还没有弄清楚后者的原因,但要记住这一点,因为它会导致类转换异常。
    • 从支持库 23.3 开始不一定能再工作。 ImageView 上的 getContext() 返回一个 TintContextWrapper,但无法检索基本上下文。
    • @0101100101 错误。您仍然可以通过转换为 ContextWrapper 来获取基本上下文。
    • 当然可以,但答案必须相应更新。就是这样:)
    【解决方案2】:

    在创建类以及调用相关方法并使用它时传递活动的引用。

    void someMethodThatUsesActivity(Activity myActivityReference) {
        myActivityReference.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    

    【讨论】:

    • 它做到了。非常感谢。
    • @khr2003 - 很高兴我能帮上忙 :)
    • 这不应该是公认的答案,因为如果您不清理所有手动创建的引用,以后可能会导致内存泄漏。您应该始终使用 Android 提供的托管上下文。请参阅我的答案。
    • @OliverHausler - 我没有看到问题,因为没有人谈论保留对活动的引用。此外,您假设问题是关于从视图中调用它,这在此处未说明。最后一件事是你假设上下文就是活动,这不一定是真的。
    • @OliverHausler - 我可能遗漏了一些东西,但我没有看到任何参考资料被保留在这里。它正在被使用并立即丢弃(当方法结束时)
    【解决方案3】:

    您可以使用以下方法将当前上下文转换为活动:

    /**
     * Get activity instance from desired context.
     */
    public static Activity getActivity(Context context) {
        if (context == null) return null;
        if (context instanceof Activity) return (Activity) context;
        if (context instanceof ContextWrapper) return getActivity(((ContextWrapper)context).getBaseContext());
        return null;
    }
    

    然后就可以从activity中获取window了。

    【讨论】:

      【解决方案4】:

      kotlin 代码:

      myView.rootView.findViewById<View>(android.R.id.content).context as Activity
      

      【讨论】:

        【解决方案5】:

        使用

        getActivity().getWindow().requestFeature(Window.FEATURE_PROGRESS);
        

        这样会更容易

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-02
          相关资源
          最近更新 更多