Java 如何在Android中的活动外部调用getWindow()?

Java 如何在Android中的活动外部调用getWindow()?,java,android,Java,Android,我试图组织我的代码,并将重复的函数移动到单个类中。 这行代码在扩展活动的类中运行良好: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); /** * Get activity instance from desired context. */ public static Activity getActivity(Conte

我试图组织我的代码,并将重复的函数移动到单个类中。 这行代码在扩展活动的类中运行良好:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
/**
 * 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;
}
但是,当我试图将其包含到外部类中时,它不起作用


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

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

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


这会更容易

你不应该像公认答案中建议的那样保留参考资料。这是可行的,但可能会导致内存泄漏

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

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

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

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

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
/**
 * 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;
}
然后您可以从活动中获取窗口。

kotlin代码:

myView.rootView.findViewById<View>(android.R.id.content).context as Activity
myView.rootView.findviewbyd(android.R.id.content).作为活动的上下文

它做到了。非常感谢。@khr2003-很高兴我能帮上忙:)这不应该是公认的答案,因为如果不清除所有手动创建的引用,以后可能会导致内存泄漏。您应该始终使用Android提供的托管上下文。请看我的答案。@OliverHausler-我看不出问题所在,因为没有人谈论保留对活动的引用。另外,您假设问题是关于从一个视图调用它,这里没有说明。最后一件事是你假设上下文就是活动,这不一定是真的。@OliverHausler-我可能遗漏了什么,但我没有看到任何引用被保留在这里。它正在被使用并立即被丢弃(当方法到达终点时)。这很旧,但值得注意的是,有两种情况下这种方法不起作用。1) 当上下文是应用程序上下文时(不会发生在视图中,但最好知道您是否在某种实用程序类中)。2) 有时,视图上下文将解析为ContextThemeWrapper,而不是活动。我还没有弄清楚后面的原因,但这需要记住,因为它会导致类强制转换异常。从支持库23.3开始,它不一定再起作用。ImageView上的getContext()返回一个无法检索基本上下文的TintContextWrapper。@0101100101错误。您仍然可以通过强制转换到ContextWrapper来获得basecontext。当然,是的,但是答案必须相应地更新。就这些:)