我想要整理我的代码并将重复的函数移动到一个单独的类中。 这行代码在扩展Activity的类中可以正常工作:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
然而,当我试图将它包含在外部类中时,它就无法正常工作。
我该如何从另一个类中调用getWindow()方法,并将其应用于一个Activity中?
根据被接受的答案所建议的方法,您不应该保留引用。这种方法虽然可行,但可能会导致内存泄漏。
相反,您应该从您的视角使用以下方法:
((Activity) getContext()).getWindow()...
在您的视图中,您拥有对活动的托管引用,可以使用getContext()检索它。将其强制转换为Activity并使用来自活动的任何方法,例如getWindow()。
在创建类时,传递活动的引用,并在调用相关方法时使用它。
void someMethodThatUsesActivity(Activity myActivityReference) {
myActivityReference.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
Window
实例必须始终从Activity
或Dialog
中检索。因此,正确的方法是通过依赖注入将Window引用传递给您的组件,然后确保您的组件不会超过Activity或Dialog的生命周期,以避免内存泄漏。
请注意,不能假设您总是可以通过查找View的Context来获取正确的Window,因为有时该View位于使用不同Window的Dialog内部。
在Android中,在Activity之外调用getWindow()方法,需要在该方法中传递Activity对象。例如,我设置了参数Activity
,以便将某个Activity设置为全屏显示。
public void fullScreen(Activity activity){
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
然后当您使用它时,设置MainActivity.this
参数
yourClassInstance.fullScreen(MainActivity.this);
使用
getActivity().getWindow().requestFeature(Window.FEATURE_PROGRESS);
这将会更容易