Android 以全屏和列表视图打开应用程序时出现故障
Android glitch opening app with full screen and list views
我已将我的应用程序和 Activity 配置为在全屏模式下工作,但我发现了一个我无法解决的问题。
当我的应用程序启动时,它从加载屏幕转到主屏幕,一切正常,但如果我按下 "home" 按钮并返回到我的应用程序(现在没有加载屏幕,应用程序已启动)然后布局被状态栏取代,我的底部栏被切断。这种效果持续 0.5-1 秒。
出现提醒通知时也会发生这种情况。
我的研究指向列表视图或类似的视图,如 viewpager。
它只是发生在我使用列表视图的活动中,然后我更改了 activity 以管理视图寻呼机上的片段,再次尝试,现在发生在每个片段中,我的意思是我的第 3 页是一个简单的片段,但它没有发生在那个上,但现在有了 view pager 就发生了。
我的清单上有相同主题的所有活动:
<activity
android:name=".OpenActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
styles.xml
<style name="AppTheme.FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowEnableSplitTouch">false</item>
</style>
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@android:color/transparent">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/navbar_space" />
<fragment
android:id="@+id/nav_bar_fragment"
android:name="es.udc.psi1516.pickapp.navbar.NavBarFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/navbar_height"
android:orientation="horizontal"
android:layout_alignParentBottom="true" />
</RelativeLayout>
我的 MainActivity.java 上有一些代码可以隐藏状态栏:
@Override
protected void onResume() {
super.onResume();
hideSystemUI();
}
// This snippet hides the system bars
public void hideSystemUI() {
int newUiOptions = getWindow().getDecorView().getSystemUiVisibility();
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}
只有当您从应用程序图标进入应用程序时才会发生这种情况,如果您从 android 任务视图返回,效果很好。我放弃了,但如果你有任何想法,我会尝试任何事情。
经过大量测试,我找到了解决方案。
我不得不从 xml 样式中删除全屏 属性,它应用了一些破坏我的应用程序屏幕的内部状态。
现在我只能在代码中管理状态。
删除 android:fitsSystemWindows="true"
这样我的布局就不会为状态栏留下额外的 space。
从样式中删除 android:windowFullscreen
,现在它看起来像这样:
<style name="AppTheme.FullScreen" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
更改标志代码以覆盖 onResume()
上的当前状态,我正在向当前状态添加标志,不要问我为什么,可能某些复制粘贴失败:
private void hideSystemUI() {
int newUiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}
我已将我的应用程序和 Activity 配置为在全屏模式下工作,但我发现了一个我无法解决的问题。
当我的应用程序启动时,它从加载屏幕转到主屏幕,一切正常,但如果我按下 "home" 按钮并返回到我的应用程序(现在没有加载屏幕,应用程序已启动)然后布局被状态栏取代,我的底部栏被切断。这种效果持续 0.5-1 秒。
出现提醒通知时也会发生这种情况。
我的研究指向列表视图或类似的视图,如 viewpager。 它只是发生在我使用列表视图的活动中,然后我更改了 activity 以管理视图寻呼机上的片段,再次尝试,现在发生在每个片段中,我的意思是我的第 3 页是一个简单的片段,但它没有发生在那个上,但现在有了 view pager 就发生了。
我的清单上有相同主题的所有活动:
<activity
android:name=".OpenActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
styles.xml
<style name="AppTheme.FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowEnableSplitTouch">false</item>
</style>
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@android:color/transparent">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/navbar_space" />
<fragment
android:id="@+id/nav_bar_fragment"
android:name="es.udc.psi1516.pickapp.navbar.NavBarFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/navbar_height"
android:orientation="horizontal"
android:layout_alignParentBottom="true" />
</RelativeLayout>
我的 MainActivity.java 上有一些代码可以隐藏状态栏:
@Override
protected void onResume() {
super.onResume();
hideSystemUI();
}
// This snippet hides the system bars
public void hideSystemUI() {
int newUiOptions = getWindow().getDecorView().getSystemUiVisibility();
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}
只有当您从应用程序图标进入应用程序时才会发生这种情况,如果您从 android 任务视图返回,效果很好。我放弃了,但如果你有任何想法,我会尝试任何事情。
经过大量测试,我找到了解决方案。
我不得不从 xml 样式中删除全屏 属性,它应用了一些破坏我的应用程序屏幕的内部状态。
现在我只能在代码中管理状态。
删除
android:fitsSystemWindows="true"
这样我的布局就不会为状态栏留下额外的 space。从样式中删除
android:windowFullscreen
,现在它看起来像这样:<style name="AppTheme.FullScreen" parent="Theme.AppCompat.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>
更改标志代码以覆盖
onResume()
上的当前状态,我正在向当前状态添加标志,不要问我为什么,可能某些复制粘贴失败:private void hideSystemUI() { int newUiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; getWindow().getDecorView().setSystemUiVisibility(newUiOptions); }