Android关闭底部全屏视图被分流出屏幕
Android closing full screen view at the bottom is shunted off the screen
我的屏幕底部工具栏使用以下样式对齐
<style name="BottomToolbar" >
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@color/WHITE</item>
<item name="android:layout_gravity">bottom</item>
<item name="android:layout_alignParentBottom">true</item>
<item name="android:minHeight">?attr/actionBarSize</item>
</style>
当我第一次进入我的屏幕时,工具栏与屏幕底部很好地对齐。
但是,如果我进入全屏模式(隐藏工具栏)然后 return 进入正常模式(重新显示工具栏),工具栏现在会稍微离开屏幕。看起来好像它向下移动了在全屏模式下隐藏的状态栏的数量。
如果我将我的应用置于后台,然后将其置于前台,底部工具栏会正确呈现。
我在屏幕顶部有一个栏(而不是 appBar)并且呈现在正确的位置。我无法弄清楚为什么它会错放底部工具栏。
就好像在确定父级的底部时,它不再根据它不是全屏高度的事实进行调整。
我试过的
我试过在退出全屏模式时在我的工具栏上设置 "fitsSystemWindows="true"" 但这没有什么区别。
我试过在隐藏工具栏时将其设置为 INVISIBLE 而不是 GONE,但这没有什么区别。
编辑 1 - 添加了我如何进入和退出全屏的代码片段
我使用以下命令进入全屏
getActivity().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);
我使用以下代码退出全屏
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
编辑 2 - View 没有被推离底部,它的高度太小
底部视图似乎没有从屏幕底部移开,它的高度缩小了,小于应有的高度。
底部视图是一个 LinearLayout,其高度设置为 "wrap_content",但似乎高度计算不正确,因为它比其内容短,因此其内容的底部被切断。
编辑 3 - 出现问题的设备
进一步调查表明,该问题仅出现在没有屏幕导航栏的设备上。例如,问题出在我的 Samsung 10" 平板电脑上,但出在我的 Nexus 5x 上。
如果我删除以下标志,问题似乎已得到解决
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
此标志的 Google 文档是“当使用其他布局标志时,我们希望提供给 fitSystemWindows(Rect) 的内容插图的稳定视图。 “
https://developer.android.com/reference/android/view/View.html
文档说
“您可能还需要使用 SYSTEM_UI_FLAG_LAYOUT_STABLE 来帮助您的应用保持稳定的布局。” (https://developer.android.com/training/system-ui/status.html) 和
“最好包含其他系统 UI 标志(例如 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_LAYOUT_STABLE),以防止内容在系统栏隐藏和显示时调整大小。" (https://developer.android.com/training/system-ui/immersive.html)
我的问题:
- 我从全屏 activity 退出到 Dark Action 主题 activity。
- 我按了软键盘上的后退按钮返回全屏 activity。
底部的视图突然被切断了。
我通过覆盖onBackPressed()
方法和重新启动解决了这个问题,我的Activity:
@Override
public void onBackPressed() {
startActivity(new Intent(getApplicationContext(), YourActivityHere.class));
}
这应该会重新创建 activity。如果你能申请,这是一个很好的黑客。
我遇到了同样的问题。我还搜索了 google 但没有得到解决方案。
我在 onBackPressed() 上应用了 100 毫秒延迟,因为我使用了 setSystemUiVisibility 但它需要时间。
问题 - 片段在 setSystemUiVisibility 之前调用,因为 setSystemUiVisibility 需要时间,所以我们需要设置后退延迟。
public static void hideToolbarFoProfile(Context mContext) {
Activity mActivity = (Activity) mContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = Objects.requireNonNull(mActivity).getWindow();
w.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.GONE);
}
public static void showToolbarFoProfile(Context mContext) {
Activity mActivity = (Activity) mContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = Objects.requireNonNull(mActivity).getWindow();
w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.VISIBLE);
}
new Handler().postDelayed(() -> {
Objects.requireNonNull(getActivity()).onBackPressed();
}, 100);
我的屏幕底部工具栏使用以下样式对齐
<style name="BottomToolbar" >
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@color/WHITE</item>
<item name="android:layout_gravity">bottom</item>
<item name="android:layout_alignParentBottom">true</item>
<item name="android:minHeight">?attr/actionBarSize</item>
</style>
当我第一次进入我的屏幕时,工具栏与屏幕底部很好地对齐。
但是,如果我进入全屏模式(隐藏工具栏)然后 return 进入正常模式(重新显示工具栏),工具栏现在会稍微离开屏幕。看起来好像它向下移动了在全屏模式下隐藏的状态栏的数量。
如果我将我的应用置于后台,然后将其置于前台,底部工具栏会正确呈现。
我在屏幕顶部有一个栏(而不是 appBar)并且呈现在正确的位置。我无法弄清楚为什么它会错放底部工具栏。
就好像在确定父级的底部时,它不再根据它不是全屏高度的事实进行调整。
我试过的
我试过在退出全屏模式时在我的工具栏上设置 "fitsSystemWindows="true"" 但这没有什么区别。
我试过在隐藏工具栏时将其设置为 INVISIBLE 而不是 GONE,但这没有什么区别。
编辑 1 - 添加了我如何进入和退出全屏的代码片段
我使用以下命令进入全屏
getActivity().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);
我使用以下代码退出全屏
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
编辑 2 - View 没有被推离底部,它的高度太小
底部视图似乎没有从屏幕底部移开,它的高度缩小了,小于应有的高度。
底部视图是一个 LinearLayout,其高度设置为 "wrap_content",但似乎高度计算不正确,因为它比其内容短,因此其内容的底部被切断。
编辑 3 - 出现问题的设备
进一步调查表明,该问题仅出现在没有屏幕导航栏的设备上。例如,问题出在我的 Samsung 10" 平板电脑上,但出在我的 Nexus 5x 上。
如果我删除以下标志,问题似乎已得到解决
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
此标志的 Google 文档是“当使用其他布局标志时,我们希望提供给 fitSystemWindows(Rect) 的内容插图的稳定视图。 “ https://developer.android.com/reference/android/view/View.html
文档说 “您可能还需要使用 SYSTEM_UI_FLAG_LAYOUT_STABLE 来帮助您的应用保持稳定的布局。” (https://developer.android.com/training/system-ui/status.html) 和 “最好包含其他系统 UI 标志(例如 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_LAYOUT_STABLE),以防止内容在系统栏隐藏和显示时调整大小。" (https://developer.android.com/training/system-ui/immersive.html)
我的问题:
- 我从全屏 activity 退出到 Dark Action 主题 activity。
- 我按了软键盘上的后退按钮返回全屏 activity。
底部的视图突然被切断了。
我通过覆盖onBackPressed()
方法和重新启动解决了这个问题,我的Activity:
@Override
public void onBackPressed() {
startActivity(new Intent(getApplicationContext(), YourActivityHere.class));
}
这应该会重新创建 activity。如果你能申请,这是一个很好的黑客。
我遇到了同样的问题。我还搜索了 google 但没有得到解决方案。 我在 onBackPressed() 上应用了 100 毫秒延迟,因为我使用了 setSystemUiVisibility 但它需要时间。
问题 - 片段在 setSystemUiVisibility 之前调用,因为 setSystemUiVisibility 需要时间,所以我们需要设置后退延迟。
public static void hideToolbarFoProfile(Context mContext) {
Activity mActivity = (Activity) mContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = Objects.requireNonNull(mActivity).getWindow();
w.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.GONE);
}
public static void showToolbarFoProfile(Context mContext) {
Activity mActivity = (Activity) mContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window w = Objects.requireNonNull(mActivity).getWindow();
w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.VISIBLE);
}
new Handler().postDelayed(() -> {
Objects.requireNonNull(getActivity()).onBackPressed();
}, 100);