android UI StatusBar(手機頂部狀態列)適配
阿新 • • 發佈:2019-02-10
前言:
狀態列指定android手機上頂部顯示手機狀態資訊的位置,狀態列是在4.4(19)加入的,在4.4以前的系統上無法實現。現在世面上的手機android4.4一下的佔比不是很大,所以不是太影響.本文目的解決4.4以上適配問題。
android 4.4(19)的介面
android 6.0(23)的介面
問題:19和23的介面statusbar不統一,顏色各異
出現原因:19根本沒有setStatusBarColor這個函式,不能改變StatusBar的顏色
解決辦法:
1. 19設定android:windowTranslucateStatus屬性,並且手動新增一個和狀態列高度等高的View
2. 5.0及以上:不設定android:windowTranslucateStatus屬性,直接設定statusBarColor的色值。
問題:當狀態列需要設定一個圖片
解決辦法:
1. 4.4:直接設定android:windowTranslucateStatus屬性。
2. 5.0:不設定,同時設定狀態列顏色透明,並使用另一個屬性。
適配類程式碼如下:
package com.example.administrator.activityexperiment;
import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
/**
* Created by beef on 2017/4/4.
*/
public class StatusBarUtils {
/**
* 將acitivity中的activity中的狀態列設定為一個純色
* @param activity 需要設定的activity
* @param color 設定的顏色(一般是titlebar的顏色)
*/
public static void setColor(Activity activity, int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0及以上,不設定透明狀態列,設定會有半透明陰影
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//設定statusBar的背景色
activity.getWindow().setStatusBarColor(color);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 生成一個狀態列大小的矩形
View statusView = createStatusBarView(activity, color);
// 新增 statusView 到佈局中
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView);
//讓我們的activity_main。xml中的佈局適應螢幕
setRootView(activity);
}
}
/**
* 當頂部是圖片時,是圖片顯示到狀態列上
* @param activity
*/
public static void setImage(Activity activity){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0及以上,不設定透明狀態列,設定會有半透明陰影
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//是activity_main。xml中的圖片可以沉浸到狀態列上
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//設定狀態列顏色透明。
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
//。。。。
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
/**
* 設定根佈局引數,讓跟佈局引數適應透明狀態列
*
*/
private static void setRootView(Activity activity) {
//獲取到activity_main.xml檔案
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
//如果不是設定引數,會使內容顯示到狀態列上
rootView.setFitsSystemWindows(true);
}
/**
* 獲取狀態列的高度
* @param acitivity
* @return
*/
private static int getStatusBarHeight(Activity acitivity){
int resourceId = acitivity.getResources().getIdentifier("status_bar_height", "dimen", "android");
return acitivity.getResources().getDimensionPixelOffset(resourceId);
}
/**
* 生成一個和狀態列大小相同的矩形條
*
* @param activity 需要設定的activity
* @param color 狀態列顏色值
* @return 狀態列矩形條
*/
private static View createStatusBarView(Activity activity, int color) {
// 繪製一個和狀態列一樣高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(color);
return statusBarView;
}
}
activity使用程式碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StatusBarUtils.setColor(this, getResources().getColor(R.color.testcolor));
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_iamge);
StatusBarUtils.setImage(this);
}
android19
android6.0
整個DEMO可以在我上傳的資源上,名字叫stastusbar適配Demo.