2

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

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

4

4 回答 4

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/

于 2013-11-06T12:34:10.913 回答
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。

于 2013-11-09T12:49:26.690 回答
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);

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

于 2013-12-18T22:51:08.363 回答
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

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

在平板电脑中隐藏系统栏

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

编码快乐!!!

于 2013-11-05T07:53:27.617 回答