Android 狀態欄沉浸式or透明化解決方案

網上有很這方面的解決方案,我要分享的是相對簡單實用的一種方案,適合救急可直接放入項目中使用,希望能幫助到您,只需要幾步就能解決(親測絕對靠譜可放心在項目中使用兼容19以下)。

話不多說干貨來了

1.自定義主題在styles.xml中

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/title_bar</item>
        <item name="colorPrimaryDark">@color/title_bar</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>

2.狀態欄兼容類

public class StatusBarCompat {

    private static final int INVALID_VAL = -1;
    private static final int COLOR_DEFAULT = Color.parseColor("#20000000");

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void compat(Activity activity, int statusColor) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (statusColor != INVALID_VAL) {
                activity.getWindow().setStatusBarColor(statusColor);
            }
            return;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            int color = COLOR_DEFAULT;
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            if (statusColor != INVALID_VAL) {
                color = statusColor;
            }
            View statusBarView = contentView.getChildAt(0);
            //改變顏色時避免重復添加statusBarView
            if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) {
                statusBarView.setBackgroundColor(color);
                return;
            }
            statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    getStatusBarHeight(activity));
            statusBarView.setBackgroundColor(color);
            contentView.addView(statusBarView, lp);
        }
    }

    public static void compat(Activity activity) {
        compat(activity, INVALID_VAL);
    }

    public static int getStatusBarHeight(Context context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
}

3.創建Activity、FragmentActivity基類方便其它頁面繼承

public class BaseActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStatusBar(this);
    }

    /**
     * 設置狀態顏色
     * @param act
     */
    public void setStatusBar(Activity act){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
                && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        StatusBarCompat.compat(act, Color.parseColor("#34A8E5"));
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        if(hasFocus){
            setStatusBar(this);
        }
        super.onWindowFocusChanged(hasFocus);
    }
}
public  class BaseFragmentActivity extends FragmentActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStatusBar(this);
    }

    /**
     * 設置狀態顏色
     * @param act
     */
    public void setStatusBar(Activity act){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
                && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        StatusBarCompat.compat(act, Color.parseColor("#34A8E5"));
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        if(hasFocus){
            setStatusBar(this);
        }
        super.onWindowFocusChanged(hasFocus);
    }
}

4.頁面布局中需要加入 android:fitsSystemWindows="true"屬性

下面給出我的測試效果圖:

H64X3O(GGW)8WPPAAAF0X3S.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 網上已經有很多有關于系統狀態欄的解決方案,這篇文章也不會有什么新奇的解決方案,都是本人經過自己試驗,統計提煉...
    btman閱讀 128,092評論 33 211
  • 背景 上篇文章一個千萬量級的APP使用的一些第三方庫中,在說到一個使用很廣泛的滑動退出庫SwipeBackLayo...
    Ziv_xiao閱讀 16,729評論 22 127
  • 前言 原文:http://blog.csdn.net/mybeta/article/details/5076032...
    naturs閱讀 23,159評論 8 70
  • 前言 首先請大家看幾張圖: 以上的效果,一般我們統稱為沉浸式狀態欄。其實,這種叫法不是很準確,而且也沒有沉浸式狀態...
    宇是我閱讀 3,928評論 2 28
  • 每天想著就是辭職,因為現在的工作內容是沒有價值的,得不到任何自我提升,另一方面跟同事之間幾乎沒有交流,生活圈子更小...
    英仔_6b07閱讀 225評論 0 0