android 狀態列狀態總結以及實現
阿新 • • 發佈:2019-01-02
情況分析:
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);
}