在 Android 4 及更高版本(4.4 除外)上,当应用程序全屏显示(使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION)时,第一次触摸后会出现导航栏(使用软件导航键)。这意味着我所有的布局都向上移动并且尺寸更小。这使得所有布局都发生了丑陋的跳跃。有没有办法让导航栏覆盖我的布局而不是向上推?
我想制作一个具有类似 YouTube 行为的视频播放器,其中导航栏在触摸后覆盖视频,因此视频不会向上移动并缩小一点,这很烦人。系统/状态栏不是问题,只是导航栏。谢谢你。
在 Android 4 及更高版本(4.4 除外)上,当应用程序全屏显示(使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION)时,第一次触摸后会出现导航栏(使用软件导航键)。这意味着我所有的布局都向上移动并且尺寸更小。这使得所有布局都发生了丑陋的跳跃。有没有办法让导航栏覆盖我的布局而不是向上推?
我想制作一个具有类似 YouTube 行为的视频播放器,其中导航栏在触摸后覆盖视频,因此视频不会向上移动并缩小一点,这很烦人。系统/状态栏不是问题,只是导航栏。谢谢你。
这行得通,需要放 onCreate():
WindowManager.LayoutParams attributes = getWindow().getAttributes();
attributes.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
getWindow().setAttributes(attributes);
您可以在链接上找到更多信息:http ://www.thekirankumar.com/blog/2013/02/10/show-and-hide-android-notification-bar-without-causing-a-layout-jerk/
忘记我以前的答案不适用于所有版本。正确的做法是找出导航栏高度并添加底部边距-navigationBarHeight。这是所有 4.1+ 版本的完整工作示例:
public static int getNavigationBarHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
}
@SuppressLint("NewApi")
private int getRealScreenSize(boolean returnWidth) {
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getActivity().getWindowManager().getDefaultDisplay();
Method mGetRawH = null, mGetRawW = null;
//Not real dimensions
display.getMetrics(metrics);
int width = metrics.heightPixels;
int height = metrics.widthPixels;
try {
// For JellyBeans and onward
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealMetrics(metrics);
//Real dimensions
width = metrics.heightPixels;
height = metrics.widthPixels;
} else {
mGetRawH = Display.class.getMethod("getRawHeight");
mGetRawW = Display.class.getMethod("getRawWidth");
try {
width = (Integer) mGetRawW.invoke(display);
height = (Integer) mGetRawH.invoke(display);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} catch (NoSuchMethodException e3) {
e3.printStackTrace();
}
if (returnWidth) {
return width;
} else {
return height;
}
}
以下示例代码需要在创建表面后放置在某处:
RelativeLayout.LayoutParams lp = (LayoutParams) surfaceView.getLayoutParams();
int screenHeight = getRealScreenSize(false);
int screenWidth = getRealScreenSize(true);
int navigationBarHeight = getNavigationBarHeight(getActivity());
lp.height = (int) (screenWidth / (16d / 9d));
lp.width = screenWidth;
int k = (lp.height - screenHeight) / 2;
lp.setMargins(0, -k, 0, (-k) - navigationBarHeight);
surfaceView.setLayoutParams(lp);
请注意,表面视图必须具有父级 RelativeLayout。
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(uiOptions);
这些标志使系统和导航栏覆盖您的内容
在下面的链接中,有关于使用“系统 UI”和“使用 SYSTEM_UI_FLAG_LOW_PROFILE、SYSTEM_UI_FLAG_VISIBLE 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION”的书面详细信息:
http://developer.android.com/about/versions/android-4.0.html#SystemUI https://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int) https://developer .android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_HIDE_NAVIGATION
我相信另一个关于“隐藏系统栏”的好问题有一些很好的答案:
希望这些能帮助您完成工作。
编码快乐!!!