导航栏下方的全屏视频

时间:2013-11-05 07:34:00

标签: android overlay navigationbar

在应用程序全屏显示(使用SYSTEM_UI_FLAG_HIDE_NAVIGATION)时,在Android 4及更高版本(不包括4.4)上,然后在第一次触摸后出现导航栏(带有软件导航键)。这意味着我的所有布局都向上移动并且尺寸更小。这使得所有布局都难以跳跃。有没有办法让导航栏覆盖我的布局而不是推动它?

我想制作一个像YouTube一样的视频播放器行为,导航栏会在触摸后覆盖视频,因此视频不会向上移动并缩小一点,这很烦人。系统/状态栏不是问题,只是导航栏。谢谢。

4 个答案:

答案 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

我相信另一个关于“隐藏系统栏”的好问题有一些很好的答案:

Hide System Bar in Tablets

希望这些能帮助您完成工作。

快乐的编码!!!

答案 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);

这些标志会使系统和导航栏覆盖您的内容