【Interface&navigation】隐藏状态栏(51)


本课程介绍如何在不同版本的Android上隐藏状态栏。隐藏状态栏(以及可选的导航栏)使内容可以使用更多的显示空间,从而提供更加身临其境的用户体验。

图1显示了一个具有可见状态栏的应用程序:
【Interface&navigation】隐藏状态栏(51)
图1.可见状态栏。

图2显示了一个带有隐藏状态栏的应用程序。请注意,操作栏也是隐藏的。如果没有状态栏,则不应显示操作栏。
【Interface&navigation】隐藏状态栏(51)
图2.隐藏状态栏。

在Android 4.0及更低版本上隐藏状态栏


您可以通过设置WindowManager标志来隐藏Android 4.0(API级别14)上的状态栏并降低状态栏 。您可以通过编程方式或通过在应用程序的清单文件中设置活动主题来执行此操作。如果状态栏应始终隐藏在您的应用程序中,那么在应用程序清单文件中设置活动主题是首选方法(严格来说,如果您愿意,可以通过编程方式覆盖主题)。例如:

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

使用活动主题的优点如下:

与以编程方式设置标志相比,它更易于维护且不易出错。
它可以实现更平滑的UI转换,因为系统具有在实例化应用程序的主要活动之前呈现UI所需的信息。
或者,您可以以编程方式设置WindowManager标志。当用户与您的应用互动时,此方法可以更轻松地隐藏和显示状态栏:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}

当您设置WindowManager标志时(无论是通过活动主题还是以编程方式),除非您的应用程序清除它们,否则标志仍然有效。

您可以使用 FLAG_LAYOUT_IN_SCREEN 设置活动布局来使用启用时可用的同一屏幕区域 FLAG_FULLSCREEN。这可以防止您的内容在状态栏隐藏和显示时调整大小。

在Android 4.1及更高版本上隐藏状态栏


您可以使用隐藏Android 4.1(API级别16)及更高级别的状态栏setSystemUiVisibility()。 setSystemUiVisibility()在单个视图级别设置UI标志; 这些设置将聚合到窗口级别。使用 setSystemUiVisibility()设置UI标志可以比使用WindowManager标志更精细地控制系统栏 。此代码段隐藏了状态栏:

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

请注意以下事项:

一旦UI标志被清除(例如,通过导航远离活动),如果您想再次隐藏栏,您的应用程序需要重置它们。有关如何监听UI可见性更改的讨论,请参阅响应UI可见性更改,以便您的应用可以相应地做出响应。
你设置UI标志的地方有所不同。如果您在活动的onCreate()方法中隐藏系统栏 并且用户按下Home,系统栏将重新出现。当用户重新打开活动时,onCreate() 将不会被调用,因此系统栏将保持可见。如果您希望系统UI更改在用户导入和导出活动时保持不变,请在onResume() 或中设置UI标记 onWindowFocusChanged()。
setSystemUiVisibility() 只有在您调用它的视图可见时,该方法才有效。
导航远离视图会导致标记设置setSystemUiVisibility() 被清除。

使内容出现在状态栏后面


在Android 4.1及更高版本中,您可以将应用程序的内容设置为显示在状态栏后面,以便在状态栏隐藏和显示时不会调整内容的大小。为此,请使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。您可能还需要使用它 SYSTEM_UI_FLAG_LAYOUT_STABLE来帮助您的应用程序保持稳定的布局。

当您使用此方法时,您有责任确保应用程序UI的关键部分(例如,地图应用程序中的内置控件)最终不会被系统栏覆盖。这可能会使您的应用无法使用。在大多数情况下,您可以通过将android:fitsSystemWindows属性添加到XML布局文件(设置为) 来处理此问题true。这会调整父级的填充ViewGroup 以为系统窗口留出空间。这对大多数应用程序来说已足够

但是,在某些情况下,您可能需要修改默认填充以获得应用程序所需的布局。要直接操作内容相对于系统栏(占据窗口的“内容插入”空间)的内容,请覆盖fitSystemWindows(Rect insets)。fitSystemWindows()当窗口的内容插入已更改时,视图层次结构调用该方法,以允许窗口相应地调整其内容。通过重写此方法,您可以根据需要处理插入(以及应用程序的布局)。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】隐藏状态栏(51)

猜你喜欢

转载自blog.51cto.com/4789781/2163687