在应用程序全屏显示(使用SYSTEM_UI_FLAG_HIDE_NAVIGATION)时,在Android 4及更高版本(不包括4.4)上,然后在第一次触摸后出现导航栏(带有软件导航键)。这意味着我的所有布局都向上移动并且尺寸更小。这使得所有布局都难以跳跃。有没有办法让导航栏覆盖我的布局而不是推动它?
我想制作一个像YouTube一样的视频播放器行为,导航栏会在触摸后覆盖视频,因此视频不会向上移动并缩小一点,这很烦人。系统/状态栏不是问题,只是导航栏。谢谢。
答案 0 :(得分:2)
这个工作,需要把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/
答案 1 :(得分:2)
忘记我之前的回答,不是在所有版本上工作。正确的方法是找出导航栏高度并添加底部边距-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。
答案 2 :(得分:0)
在下面的链接中,有关于使用“系统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
我相信另一个关于“隐藏系统栏”的好问题有一些很好的答案:
希望这些能帮助您完成工作。
快乐的编码!!!
答案 3 :(得分:0)
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);
这些标志会使系统和导航栏覆盖您的内容