如何在Android中的Activity外调用getWindow()?

Kal*_*mah 40 java android

我正在尝试组织我的代码并将重复的函数移动到单个类.这行代码在扩展活动的类中工作正常:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将其包含在外部类中时,它无法正常工作.

如何从另一个类调用getWindow()将其应用于Activity中?

Oli*_*ler 44

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

请从您的视图中使用此选项:

((Activity) getContext()).getWindow()...
Run Code Online (Sandbox Code Playgroud)

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

  • 这是旧的但值得注意的是,有两种情况不适用.1)当上下文是Application上下文时(不会在视图中发生,但很高兴知道你是否在某种类型的实用程序类中).2)偶尔视图上下文将解析为ContextThemeWrapper而不是活动.我没有弄清楚后者的原因,但要注意这一点,因为它会导致类强制转换异常. (4认同)

MBy*_*ByD 41

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

void someMethodThatUsesActivity(Activity myActivityReference) {
    myActivityReference.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Run Code Online (Sandbox Code Playgroud)

  • 这不应该是可接受的答案,因为如果您不清除所有手动创建的引用,它可能会在以后导致内存泄漏.您应该始终使用Android提供的托管上下文.相反,请参阅我的回答. (9认同)
  • @OliverHausler - 我没有看到问题,因为没有人谈论保持对活动的引用.另外,你假设问题是关于从视图中调用它,这里没有说明.最后一件事是你假设上下文是活动,这不一定是真的. (3认同)
  • @OliverHausler - 我可能会遗漏一些东西,但我看不到任何参考文献.它被使用并立即丢弃(方法到达终点) (3认同)

Hex*_*ise 13

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

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以从活动中获取窗口.