1. 程式人生 > >android 狀態列狀態總結以及實現

android 狀態列狀態總結以及實現

情況分析:

1.全屏、不保留狀態列文字(Splash頁面,歡迎頁面)
2.全屏保留狀態列文字(頁面上部有Banner圖)
3.標題欄與狀態列顏色一致(部分App風格)
4.不同Fragment中對StatusBar的處理不一樣
5.設定狀態列文字的顏色
6.切換fragment時,toolBar顯示與否、statusbar顯示與否、statusBar顏色、statusBar文字顏色(新增)

實現:
1. 全屏,不保留狀態列文字(Splash頁面,歡迎頁面)

首先在style.xml中設定為noActionBar的主題

<style name="fullScreen" parent="Theme.AppCompat.DayNight.NoActionBar">
</style>

方式有三種:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen_no_text);
    //方式一
    //getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    //方式二
    //getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
    //方式三 style.xml中配置
    //<style name="fullScreen" parent="Theme.AppCompat.DayNight.NoActionBar">
    //        <item name="android:windowFullscreen">true</item>
    //</style>
}

2.需求二、全屏保留狀態列文字(頁面上部有Banner圖)

現在專案,大部分向下支援到19,所以先不考慮太低版本的情況
Window window = getWindow();
//預設API 最低19 
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    ViewGroup contentView = window.getDecorView().findViewById(Window.ID_ANDROID_CONTENT);
    contentView.getChildAt(0).setFitsSystemWindows(false);
}

3.需求三、標題欄與狀態列顏色一致 xml中配置

<style name="status_toolbar_same_color" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/status_toolBar_same_color</item>
    <item name="colorPrimaryDark">@color/status_toolBar_same_color</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>


Window window = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(getResources().getColor(R.color.status_toolBar_same_color));
} else {
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    ViewGroup systemContent = findViewById(android.R.id.content);
    View statusBarView = new View(this);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());
    statusBarView.setBackgroundColor(getResources().getColor(R.color.status_toolBar_same_color));
    systemContent.getChildAt(0).setFitsSystemWindows(true);
    systemContent.addView(statusBarView, 0, lp);
}

4
需求四、不同Fragment中對StatusBar的處理不一樣

下邊程式碼是兩個Fragment所依附的Activity對應的部分layout

        <android.support.v7.widget.Toolbar
            android:id="@+id/base_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/holo_blue_dark">
            <TextView
                android:id="@+id/base_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:textColor="@android:color/black" />
        </android.support.v7.widget.Toolbar>
        <FrameLayout
            android:id="@+id/base_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
        </FrameLayout>

上面是對應Activity中的佈局,意思就是不使用系統提供的ActionBar,使用ToolBar來代替(網上一大推代替的方法),下面的程式碼中設定,狀態列透明,並且設定了sitFitSystemWindow(false),通過這些操作,我們相當於把系統的StatusBar,ActionBar,都幹掉了,那麼接下來,我們就可以模擬創建出StatusBaruserContent.addView(mStatusBarView, 0);那麼現在我們就可以自己控制statusBar和ActionBar,顯示什麼顏色?消失還是隱藏?

private void addStatusBar() {
    //條件狀態列透明,要不然不會起作用
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    if (mStatusBarView == null) {
        mStatusBarView = new View(FragmentStatusAndActionBarActivity.this);
        int screenWidth = getResources().getDisplayMetrics().widthPixels;
        int statusBarHeight = getStatusBarHeight();
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(screenWidth, statusBarHeight);
        mStatusBarView.setLayoutParams(params);
        mStatusBarView.requestLayout();
        //獲取根佈局
        ViewGroup systemContent = findViewById(android.R.id.content);
        ViewGroup userContent = (ViewGroup) systemContent.getChildAt(0);
        userContent.setFitsSystemWindows(false);
        userContent.addView(mStatusBarView, 0);
    }
}

ToolBar顯示的Fragment:
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    mActivity.mToolbar.setVisibility(View.VISIBLE);//設定ToolBar顯示
    //設定statusBar的顏色
    mActivity.mStatusBarView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_bright));
}

ToolBar隱藏的Fragment

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    mActivity.mToolbar.setVisibility(View.GONE);//設定ToolBar消失
    //設定statusBar的顏色
    mActivity.mStatusBarView.setBackgroundColor(getResources().getColor(android.R.color.holo_orange_light));
}

5 需求五、設定狀態列文字的顏色

//設定白底黑字
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView()
        .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

但是需要注意的是:目前只有android原生6.0以上支援修改狀態列字型。

6.需求六、切換fragment時,toolBar和statusbar顯示與否、statusBar顏色、status文字顏色(新增)

這是隻有Banner的fragment:
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    //設定ToolBar隱藏
    mActivity.mToolbar.setVisibility(View.GONE);
    //設定statusBar的隱藏
    mActivity.mStatusBarView.setVisibility(View.GONE);
    //恢復預設statusBar文字顏色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        mActivity.getWindow().getDecorView().setSystemUiVisibility(View.VISIBLE);
    mActivity.mStatusBarView.setVisibility(View.GONE);
}

改變statusBar字型顏色
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    //設定ToolBar顯示
    mActivity.mToolbar.setVisibility(View.VISIBLE);
    //設定ToolBar的顏色
    mActivity.mToolbar.setBackgroundColor(getResources().getColor(R.color.colorAccent));
    //設定statusBar的顏色
    mActivity.mStatusBarView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
    //設定statusBar顯示
    mActivity.mStatusBarView.setVisibility(View.VISIBLE);
    //設定statusBar字型顏色
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        mActivity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}