1. 程式人生 > >android UI StatusBar(手機頂部狀態列)適配

android UI StatusBar(手機頂部狀態列)適配

前言:

狀態列指定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.

參考文章: