如何获取 Nativescript angular 模态的原生视图 window 的引用?
How to get the reference of a Nativescript angular modal's native view window?
我试图仅在模态页面中设置沉浸式模式,但是当我在模态组件的 ngOnInit
中执行以下操作时
Application.android.foregroundActivity.getWindow().getDecorView().setSystemUiVisibility(
// tslint:disable-next-line:no-bitwise
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_IMMERSIVE
);
它为应用程序全局设置沉浸式视图,模态视图除外。模态视图仍然保留导航栏和状态栏。
基本上我想要的是获得对模态 window 的引用,以便我可以使用它来设置全屏标志。我使用 fragment manager
尝试了很多东西,但它似乎根本不起作用。
我 运行 在我自己的应用程序中遇到了同样的问题。我能够使用下面的方法解决它(@nativescript/core: 7.2.1)。
首先,我获得了对模态视图中使用的根组件的引用:
component.html
<AbsoluteLayout #root>
<!-- the rest of the modal -->
</AbsoluteLayout>
component.ts
export class Component {
//...
@ViewChild("root", { static: true }) root: ElementRef;
//...
}
其次,我创建了一个尝试隐藏状态栏的方法。这需要反复试验才能获得对正确本机对象的引用,但下面的链最终对我有用:
component.ts
hideAndroidStatusBar(): void {
if(!global.isIOS) {
let decorView = this.root.nativeElement._dialogFragment.getDialog().getWindow().getDecorView();
decorView.setSystemUiVisibility(android.view.View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
最后,我在组件的 ngOnInit 函数中设置了一个时间间隔,它会尝试隐藏状态栏,直到成功为止。这样做是因为引用链在初始化期间没有解析,我找不到可靠的回调来注册它。
component.ts
ngOnInit(): void {
let hideBar = setInterval(() => {
try {
this.hideAndroidStatusBar();
clearInterval(hideBar);
} catch { }
}, 50);
}
虽然这种方法对我有用,但感觉有点笨拙……不能保证它对其他任何人都有效。
对于遇到同样问题的任何人。
这就是我所做的。这与aleroy发布的答案非常相似。
首先,我获得了模态视图中使用的根组件的引用
然后在:
ngAfterViewInit() {
setTimeout(() => {
this._modalWindow = this.root.nativeElement._dialogFragment.getDialog().getWindow();
this._modalWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// this._modalWindow.setStatusBarColor(android.graphics.Color.BLACK)
this._modalWindow.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
}, 1);
}
要清除全屏并隐藏导航标志:
ngOnDestroy() {
this._modalWindow.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
this._modalWindow.getDecorView().setSystemUiVisibility(
// tslint:disable-next-line:no-bitwise
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
);
}
我试图仅在模态页面中设置沉浸式模式,但是当我在模态组件的 ngOnInit
中执行以下操作时
Application.android.foregroundActivity.getWindow().getDecorView().setSystemUiVisibility(
// tslint:disable-next-line:no-bitwise
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_IMMERSIVE
);
它为应用程序全局设置沉浸式视图,模态视图除外。模态视图仍然保留导航栏和状态栏。
基本上我想要的是获得对模态 window 的引用,以便我可以使用它来设置全屏标志。我使用 fragment manager
尝试了很多东西,但它似乎根本不起作用。
我 运行 在我自己的应用程序中遇到了同样的问题。我能够使用下面的方法解决它(@nativescript/core: 7.2.1)。
首先,我获得了对模态视图中使用的根组件的引用:
component.html
<AbsoluteLayout #root>
<!-- the rest of the modal -->
</AbsoluteLayout>
component.ts
export class Component {
//...
@ViewChild("root", { static: true }) root: ElementRef;
//...
}
其次,我创建了一个尝试隐藏状态栏的方法。这需要反复试验才能获得对正确本机对象的引用,但下面的链最终对我有用:
component.ts
hideAndroidStatusBar(): void {
if(!global.isIOS) {
let decorView = this.root.nativeElement._dialogFragment.getDialog().getWindow().getDecorView();
decorView.setSystemUiVisibility(android.view.View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
最后,我在组件的 ngOnInit 函数中设置了一个时间间隔,它会尝试隐藏状态栏,直到成功为止。这样做是因为引用链在初始化期间没有解析,我找不到可靠的回调来注册它。
component.ts
ngOnInit(): void {
let hideBar = setInterval(() => {
try {
this.hideAndroidStatusBar();
clearInterval(hideBar);
} catch { }
}, 50);
}
虽然这种方法对我有用,但感觉有点笨拙……不能保证它对其他任何人都有效。
对于遇到同样问题的任何人。 这就是我所做的。这与aleroy发布的答案非常相似。
首先,我获得了模态视图中使用的根组件的引用 然后在:
ngAfterViewInit() {
setTimeout(() => {
this._modalWindow = this.root.nativeElement._dialogFragment.getDialog().getWindow();
this._modalWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// this._modalWindow.setStatusBarColor(android.graphics.Color.BLACK)
this._modalWindow.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
}, 1);
}
要清除全屏并隐藏导航标志:
ngOnDestroy() {
this._modalWindow.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
this._modalWindow.getDecorView().setSystemUiVisibility(
// tslint:disable-next-line:no-bitwise
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
);
}