1.自定義Toolbar
Toolbar雖然也提供了setTitle()等一些相應的方法,但都不是自己想要的樣式。這裏先創建一個layout用作Toolbar內容視圖。
- Toolbar內容視圖layout_common_toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:toolbar="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/common_toolbar"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="?attr/colorPrimary"
android:fitsSystemWindows="true"
android:minHeight="?attr/actionBarSize"
toolbar:contentInsetLeft="0dp"
toolbar:contentInsetStart="0dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/common_toolbar_center_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true">
<TextView
android:id="@+id/common_toolbar_center_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="標題"
android:textColor="#000000"
android:textSize="14sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/common_toolbar_left_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<ImageView
android:id="@+id/common_toolbar_left_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@mipmap/icon_toolbar_back" />
<TextView
android:id="@+id/common_toolbar_left_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/common_toolbar_left_image"
android:includeFontPadding="false"
android:text="返回"
android:textColor="#000000"
android:textSize="14sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/common_toolbar_right_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:paddingLeft="15dp"
android:paddingRight="15dp">
<TextView
android:id="@+id/common_toolbar_right_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:includeFontPadding="false"
android:text="完成"
android:textColor="#000000"
android:textSize="14sp" />
<ImageView
android:id="@+id/common_toolbar_right_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
</RelativeLayout>
</RelativeLayout>
</android.support.v7.widget.Toolbar>
<View
android:id="@+id/common_toolbar_split_line"
android:layout_width="match_parent"
android:layout_height="@dimen/line_size"
android:background="@color/line_color" />
</LinearLayout>
- 自定義Toolbar,代碼如下:
package com.common.basis.widget;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.common.basis.R;
/**
* 作者:蒙景博
* 時間:2017/4/23
* 描述:公共狀態欄
*/
public class CommonToolbar extends LinearLayout {
protected Context mContext;
protected Toolbar mToolbar;
// 左側按鈕文本相關配置
protected String leftText;
protected float leftTextSize;
protected int leftTextColor;
protected int leftIconResource;
protected int leftIconBackgroundResource;
protected RelativeLayout mRightContainer;
protected TextView mLeftText;
protected ImageView mLeftIcon;
protected boolean leftIconState; // true顯示,false隱藏
// 中間標題相關配置
protected String titleText;
protected float titleTextSize;
protected int titleTextColor;
protected RelativeLayout mCenterContainer;
protected TextView mTitleText;
// 右側按鈕文本相關配置
protected String rightText;
protected float rightTextSize;
protected int rightTextColor;
protected int rightIconResource;
protected int rightIconBackgroundResource;
protected RelativeLayout mLeftContainer;
protected TextView mRightText;
protected ImageView mRightImage;
//分割線
protected View mSplitLine;
public CommonToolbar(Context context) {
this(context, null);
}
public CommonToolbar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CommonToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initViewAttribute(context, attrs);
}
/**
* 初始化Toolbar屬性
*
* @param context
* @param attrs
*/
private void initViewAttribute(Context context, AttributeSet attrs) {
this.mContext = context;
inflate(context, R.layout.layout_common_toolbar, this);
mToolbar = (Toolbar) findViewById(R.id.common_toolbar);
mLeftContainer = (RelativeLayout) findViewById(R.id.common_toolbar_left_container);
mCenterContainer = (RelativeLayout) findViewById(R.id.common_toolbar_center_container);
mRightContainer = (RelativeLayout) findViewById(R.id.common_toolbar_right_container);
mLeftText = (TextView) findViewById(R.id.common_toolbar_left_text);
mTitleText = (TextView) findViewById(R.id.common_toolbar_center_text);
mRightText = (TextView) findViewById(R.id.common_toolbar_right_text);
mLeftIcon = (ImageView) findViewById(R.id.common_toolbar_left_image);
mRightImage = (ImageView) findViewById(R.id.common_toolbar_right_image);
mSplitLine = findViewById(R.id.common_toolbar_split_line);
TypedArray mArray = context.obtainStyledAttributes(attrs, R.styleable.CommonToolbar);
try {
leftIconState = mArray.getBoolean(R.styleable.CommonToolbar_leftIconState, true);
leftText = mArray.getString(R.styleable.CommonToolbar_leftText);
leftTextSize = mArray.getDimension(R.styleable.CommonToolbar_leftTextSize, getTypedValue(context, 14, false));
leftTextColor = mArray.getColor(R.styleable.CommonToolbar_leftTextColor, Color.parseColor("#000000"));
leftIconResource = mArray.getResourceId(R.styleable.CommonToolbar_leftIconResource, 0);
leftIconBackgroundResource = mArray.getResourceId(R.styleable.CommonToolbar_leftIconBackgroundResource, 0);
titleText = mArray.getString(R.styleable.CommonToolbar_titleText);
titleTextSize = mArray.getDimension(R.styleable.CommonToolbar_titleTextSize, getTypedValue(context, 14, false));
titleTextColor = mArray.getColor(R.styleable.CommonToolbar_titleTextColor, Color.parseColor("#000000"));
rightText = mArray.getString(R.styleable.CommonToolbar_rightText);
rightTextSize = mArray.getDimension(R.styleable.CommonToolbar_rightTextSize, getTypedValue(context, 14, false));
rightTextColor = mArray.getColor(R.styleable.CommonToolbar_rightTextColor, Color.parseColor("#000000"));
rightIconResource = mArray.getResourceId(R.styleable.CommonToolbar_rightIconResource, 0);
rightIconBackgroundResource = mArray.getResourceId(R.styleable.CommonToolbar_rightIconBackgroundResource, 0);
} finally {
mArray.recycle();
}
// left text
if (!TextUtils.isEmpty(leftText)) {
mLeftText.setText(leftText);
} else {
mLeftText.setVisibility(View.INVISIBLE);
}
mLeftText.setTextSize(getTypedValue(context, leftTextSize, true));
if (leftTextColor != 0) {
mLeftText.setTextColor(leftTextColor);
}
if (leftIconState) {
mLeftIcon.setVisibility(View.VISIBLE);
if (leftIconResource != 0) {
mLeftIcon.setImageResource(leftIconResource);
}
if (leftIconBackgroundResource != 0) {
mLeftIcon.setBackgroundResource(leftIconBackgroundResource);
}
} else {
mLeftIcon.setVisibility(View.GONE);
}
// title text
if (!TextUtils.isEmpty(titleText)) {
mTitleText.setText(titleText);
} else {
mTitleText.setVisibility(View.INVISIBLE);
}
mTitleText.setTextSize(getTypedValue(context, titleTextSize, true));
if (titleTextColor != 0) {
mTitleText.setTextColor(titleTextColor);
}
// right text
if (!TextUtils.isEmpty(rightText)) {
mRightText.setText(rightText);
} else {
mRightText.setVisibility(View.GONE);
}
mRightText.setTextSize(getTypedValue(context, rightTextSize, true));
if (rightTextColor != 0) {
mRightText.setTextColor(rightTextColor);
}
if (rightIconResource != 0) {
mRightImage.setImageResource(rightIconResource);
}
if (rightIconBackgroundResource != 0) {
mRightImage.setBackgroundResource(rightIconBackgroundResource);
}
}
public boolean isLeftIconState() {
return leftIconState;
}
public void setLeftIconState(boolean leftIconState) {
if (leftIconState) {
mLeftIcon.setVisibility(View.VISIBLE);
} else {
mLeftIcon.setVisibility(View.GONE);
}
}
public Toolbar getToolbar() {
return mToolbar;
}
public TextView getLeftText() {
return mLeftText;
}
/**
* 設置標題左側字體Text
*
* @param leftText
*/
public void setLeftText(String leftText) {
if (mLeftText.getVisibility() == View.INVISIBLE) {
mLeftText.setVisibility(View.VISIBLE);
}
mLeftText.setText(leftText);
}
public ImageView getLeftImage() {
return mLeftIcon;
}
public TextView getTitleText() {
return mTitleText;
}
/**
* 設置標題中間字體Text
*
* @param titleText
*/
public void setTitleText(String titleText) {
if (mTitleText.getVisibility() == View.INVISIBLE) {
mTitleText.setVisibility(View.VISIBLE);
}
mTitleText.setText(titleText);
}
public TextView getRightText() {
return mRightText;
}
/**
* 設置標題右側字體Text
*
* @param rightText
*/
public void setRightText(String rightText) {
if (mRightText.getVisibility() == View.GONE) {
mRightText.setVisibility(View.VISIBLE);
}
mRightText.setText(rightText);
}
public ImageView getRightImage() {
return mRightImage;
}
public RelativeLayout getLeftContainer() {
return mLeftContainer;
}
public RelativeLayout getCenterContainer() {
return mCenterContainer;
}
public RelativeLayout getRightContainer() {
return mRightContainer;
}
/**
* 爲標題欄背景設置一個Drawable
*
* @param background
*/
public void setTitleBackground(Drawable background) {
mToolbar.setBackgroundDrawable(background);
}
/**
* 爲標題欄背景設置一個Color
*
* @param color
*/
public void setTitleBackgroundColor(int color) {
mToolbar.setBackgroundColor(getResources().getColor(color));
}
/**
* 爲標題欄背景設置一個Resource
*
* @param resid
*/
public void setTitleBackgroundResource(int resid) {
mToolbar.setBackgroundResource(resid);
}
/**
* 設置標題左側字體Size
*
* @param leftTextSize
*/
public void setLeftTextSize(int leftTextSize) {
mLeftText.setTextSize(leftTextSize);
}
/**
* 設置標題左側字體Color
*
* @param leftTextColor
*/
public void setLeftTextColor(int leftTextColor) {
mLeftText.setTextColor(leftTextColor);
}
/**
* 爲標題左側圖片設置一個Resource
*
* @param resId
*/
public void setLeftIcon(int resId) {
mLeftIcon.setImageResource(resId);
}
/**
* 設置左側圖片背景設置一個Resource
*
* @param resId
*/
public void setLeftIconBackgroundResource(int resId) {
mLeftIcon.setBackgroundResource(resId);
}
/**
* 設置標題中間字體Size
*
* @param titleTextSize
*/
public void setTitleTextSize(int titleTextSize) {
mTitleText.setTextSize(titleTextSize);
}
/**
* 設置標題中間字體Color
*
* @param titleTextColor
*/
public void setTitleTextColor(int titleTextColor) {
mTitleText.setTextColor(titleTextColor);
}
/**
* 設置標題右側字體Size
*
* @param rightTextSize
*/
public void setRightTextSize(int rightTextSize) {
mRightText.setTextSize(rightTextSize);
}
/**
* 設置標題右側字體Color
*
* @param rightTextColor
*/
public void setRightTextColor(int rightTextColor) {
mRightText.setTextColor(rightTextColor);
}
/**
* 爲標題左側圖片設置一個Resource
*
* @param resId
*/
public void setRightIcon(int resId) {
mRightImage.setImageResource(resId);
}
/**
* 設置左側圖片背景設置一個Resource
*
* @param resId
*/
public void setRightIconBackgroundResource(int resId) {
mRightImage.setBackgroundResource(resId);
}
/**
* 設置左側按鈕點擊事件
*
* @param listener
*/
public void setLeftOnClickListener(OnClickListener listener) {
mLeftContainer.setOnClickListener(listener);
}
/**
* 設置點擊左側按鈕時結束當前Activity或者Fragment
*
* @param activity
*/
public void setLeftFinishActivity(final Activity activity) {
if (activity == null)
return;
mLeftContainer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
activity.finish();
}
});
}
/**
* 設置右側按鈕點擊事件
*
* @param listener
*/
public void setRightOnClickListener(OnClickListener listener) {
mRightContainer.setOnClickListener(listener);
}
/**
* 添加一個layout在左側標題的layout上
*
* @param layoutId
*/
public void addLeftView(int layoutId) {
if (layoutId == 0 && mLeftContainer == null)
return;
mLeftContainer.removeAllViews();
mLeftContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
}
/**
* 添加一個View在左側標題的layout上
*
* @param view
*/
public void addLeftView(View view) {
if (view == null && mLeftContainer == null)
return;
mLeftContainer.removeAllViews();
mLeftContainer.addView(view);
}
public void setLeftViewGravity(int gravity) {
mLeftContainer.setGravity(gravity);
}
/**
* 添加一個layout在中間標題的layout上
*
* @param layoutId
*/
public void addTitleView(int layoutId) {
if (layoutId == 0 && mCenterContainer == null)
return;
mCenterContainer.removeAllViews();
mCenterContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
}
/**
* 添加一個View在中間標題的layout上
*
* @param view
*/
public void addTitleView(View view) {
if (view == null && mCenterContainer == null)
return;
mCenterContainer.removeAllViews();
mCenterContainer.addView(view);
}
public void setTitleViewGravity(int gravity) {
mCenterContainer.setGravity(gravity);
}
/**
* 添加一個layout在右側標題的layout上
*
* @param layoutId
*/
public void addRightView(int layoutId) {
if (layoutId == 0 && mRightContainer == null)
return;
mRightContainer.removeAllViews();
mRightContainer.addView(LayoutInflater.from(mContext).inflate(layoutId, null));
}
/**
* 添加一個View在右側標題的layout上
*
* @param view
*/
public void addRightView(View view) {
if (view == null && mRightContainer == null)
return;
mRightContainer.removeAllViews();
mRightContainer.addView(view);
}
public void setRightViewGravity(int gravity) {
mRightContainer.setGravity(gravity);
}
public void setSplitLineVisibile(boolean visibile) {
if (visibile) {
mSplitLine.setVisibility(View.VISIBLE);
} else {
mSplitLine.setVisibility(View.GONE);
}
}
private int getTypedValue(Context context, float value, boolean convertType) {
final float scale = context.getResources().getDisplayMetrics().density;
if (convertType) {
return (int) (value / scale + 0.5f);
} else {
return (int) (value * scale + 0.5f);
}
}
}
- 自定義相關屬性:
<!--自定義Toolbar相關屬性-->
<declare-styleable name="CommonToolbar">
<!--left-->
<!--左側Icon true顯示,false隱藏-->
<attr name="leftIconState" format="boolean" />
<attr name="leftText" format="string|reference" />
<attr name="leftTextColor" format="color" />
<attr name="leftTextSize" format="dimension|integer|reference" />
<attr name="leftIconResource" format="reference" />
<attr name="leftIconBackgroundResource" format="reference" />
<!--center-->
<attr name="titleText" format="string|reference" />
<attr name="titleTextColor" format="color" />
<attr name="titleTextSize" format="dimension|integer|reference" />
<!--right-->
<attr name="rightText" format="string|reference" />
<attr name="rightTextColor" format="color" />
<attr name="rightTextSize" format="dimension|integer|reference" />
<attr name="rightIconResource" format="reference" />
<attr name="rightIconBackgroundResource" format="reference" />
</declare-styleable>
- 自定義Activity主題,根據需求可自行擴展:
<!--application default base theme-->
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<!--android:windowDisablePreview Activity啓動性能優化-->
<item name="android:windowDisablePreview">true</item>
</style>
<!--默認主題主題-->
<style name="AppTheme.Default" parent="AppTheme.Base">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
<!--擴展純白色背景主題-->
<style name="AppTheme.White" parent="AppTheme.Base">
<item name="colorPrimary">@android:color/white</item>
<item name="colorPrimaryDark">@android:color/white</item>
</style>
<!--擴展純黃色背景主題-->
<style name="AppTheme.Yellow" parent="AppTheme.Base">
<item name="colorPrimary">@color/yellow</item>
<item name="colorPrimaryDark">@color/yellow</item>
</style>
2.ImmersiveStatusBar類,給Windonw添加不同的Flag展現出不同的樣式。
package com.common.utils;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 作者:秦川小將
* 描述:沉浸式狀態欄
*/
public class ImmersiveStatusBar{
private Activity mActivity;
public ImmersiveStatusBar(Activity activity) {
this.mActivity = activity;
}
/**
* @param color 顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int color) {
setColorBar(color, 0);
}
/**
* @param color 顏色
* @param alpha 透明度
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int color, int alpha) {
setColorBar(color, alpha, false);
}
/**
* @param color 顏色
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int color, boolean isTransformNavigationBar) {
setColorBar(color, 0, isTransformNavigationBar);
}
/**
* @param color 顏色
* @param alpha 透明度
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBar(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = mActivity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
window.setStatusBarColor(alphaColor);
if (isTransformNavigationBar) {
window.setNavigationBarColor(alphaColor);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = mActivity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
ViewGroup decorView = (ViewGroup) window.getDecorView();
decorView.addView(createStatusBarView(mActivity, alphaColor));
if (navigationBarExist(mActivity) && isTransformNavigationBar) {
decorView.addView(createNavigationBarView(mActivity, alphaColor));
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
setRootView(mActivity, true);
}
}
/**
* @param color 顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBarForDrawer(@ColorInt int color) {
setColorBarForDrawer(color, 0);
}
/**
* @param color 顏色
* @param alpha 透明度
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBarForDrawer(@ColorInt int color, int alpha) {
setColorBarForDrawer(color, alpha, false);
}
/**
* @param color 顏色
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBarForDrawer(@ColorInt int color, boolean isTransformNavigationBar) {
setColorBarForDrawer(color, 0, isTransformNavigationBar);
}
/**
* @param color 顏色
* @param alpha 透明度
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setColorBarForDrawer(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = mActivity.getWindow();
ViewGroup decorView = (ViewGroup) window.getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (navigationBarExist(mActivity)) {
option = option | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
}
decorView.setSystemUiVisibility(option);
window.setStatusBarColor(Color.TRANSPARENT);
if (isTransformNavigationBar) {
window.setNavigationBarColor(Color.TRANSPARENT);
}
int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
decorView.addView(createStatusBarView(mActivity, alphaColor), 0);
if (navigationBarExist(mActivity) && isTransformNavigationBar) {
decorView.addView(createNavigationBarView(mActivity, alphaColor), 1);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = mActivity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) window.getDecorView();
int alphaColor = alpha == 0 ? color : calculateColor(color, alpha);
decorView.addView(createStatusBarView(mActivity, alphaColor), 0);
if (navigationBarExist(mActivity) && isTransformNavigationBar) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
decorView.addView(createNavigationBarView(mActivity, alphaColor), 1);
}
}
}
/**
* 設置狀態欄文本和圖標顏色(黑,白)
*
* @param isChangeColor 是否改變顏色 true:黑色 false:白色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setStatusTextAndIconColor(boolean isChangeColor) {
// 6.0以及6.0以上狀態欄字體變色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeColor) {
if (isMIUI()) {
setMiuiStatusBarDarkMode(mActivity, isChangeColor);
} else {
Window window = mActivity.getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setImmersionBar() {
setTransparentBar(Color.TRANSPARENT);
}
/**
* @param color 顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setTransparentBar(@ColorInt int color) {
setTransparentBar(color, 0);
}
/**
* @param color 顏色
* @param alpha 透明度
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setTransparentBar(@ColorInt int color, int alpha) {
setTransparentBar(color, alpha, false);
}
/**
* @param color 顏色
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setTransparentBar(@ColorInt int color, boolean isTransformNavigationBar) {
setTransparentBar(color, 0, isTransformNavigationBar);
}
/**
* @param color 顏色
* @param alpha 透明度
* @param isTransformNavigationBar 是否改變導航欄顏色
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setTransparentBar(@ColorInt int color, int alpha, boolean isTransformNavigationBar) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = mActivity.getWindow();
View decorView = window.getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
int finalColor = alpha == 0 ? Color.TRANSPARENT :
Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
window.setStatusBarColor(finalColor);
if (isTransformNavigationBar) {
window.setNavigationBarColor(finalColor);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = mActivity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup decorView = (ViewGroup) window.getDecorView();
int finalColor = alpha == 0 ? Color.TRANSPARENT :
Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
decorView.addView(createStatusBarView(mActivity, finalColor));
if (navigationBarExist(mActivity) && isTransformNavigationBar) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
decorView.addView(createNavigationBarView(mActivity, finalColor));
}
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setHintBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View decorView = mActivity.getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
/**
* 創建狀態欄視圖
*
* @param context
* @param color
* @return
*/
private View createStatusBarView(Context context, @ColorInt int color) {
View mStatusBarTintView = new View(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));
params.gravity = Gravity.TOP;
mStatusBarTintView.setLayoutParams(params);
mStatusBarTintView.setBackgroundColor(color);
return mStatusBarTintView;
}
/**
* 創建導航欄視圖
*
* @param context
* @param color
* @return
*/
private View createNavigationBarView(Context context, @ColorInt int color) {
View mNavBarTintView = new View(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationHeight(context));
params.gravity = Gravity.BOTTOM;
mNavBarTintView.setLayoutParams(params);
mNavBarTintView.setBackgroundColor(color);
return mNavBarTintView;
}
/**
* 導航欄是否存在
*
* @param activity
* @return
*/
private boolean navigationBarExist(Activity activity) {
WindowManager windowManager = activity.getWindowManager();
Display d = windowManager.getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
d.getRealMetrics(realDisplayMetrics);
}
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
}
@ColorInt
private int calculateColor(@ColorInt int color, int alpha) {
float a = 1 - alpha / 255f;
int red = color >> 16 & 0xff;
int green = color >> 8 & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return 0xff << 24 | red << 16 | green << 8 | blue;
}
/**
* 設置根視圖
*
* @param activity
* @param fit
*/
private void setRootView(Activity activity, boolean fit) {
ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
for (int i = 0, count = parent.getChildCount(); i < count; i++) {
View childView = parent.getChildAt(i);
if (childView instanceof ViewGroup) {
childView.setFitsSystemWindows(fit);
((ViewGroup) childView).setClipToPadding(fit);
}
}
}
/**
* 獲取狀態欄的高度
*
* @param context
* @return
*/
private int getStatusBarHeight(Context context) {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
/**
* 獲取到導航高度
*
* @param context
* @return
*/
public int getNavigationHeight(Context context) {
int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
/**
* miui 更改字體
*
* @param activity
* @param darkmode
* @return
*/
public boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
int darkModeFlag = 0;
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 判斷是否爲miui
*
* @return
*/
public boolean isMIUI() {
String manufacturer = Build.MANUFACTURER;
if ("xiaomi".equalsIgnoreCase(manufacturer)) {
return true;
}
return false;
}
}
3.適配使用
- 在activity的根視圖中添加
android:fitsSystemWindows="true"
- 示例xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:toolbar="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E2E2E2"
android:fitsSystemWindows="true">
<com.common.basis.widget.CommonToolbar
android:layout_width="match_parent"
android:layout_height="45dp"
toolbar:leftText="返回"
toolbar:rightText="設置"
toolbar:titleText="標題" />
</LinearLayout>
- 在AndroidManifest爲當前Activity設置主題,如:
android:theme="@style/AppTheme.Yellow"
- 在onCreate()方法中創建ImmersiveStatusBar對象,調用其屬性,ImmersiveStatusBar提供了多種方案,可根據需求設置。案例實例如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImmersiveStatusBar mImmersiveStatusBar = new ImmersiveStatusBar(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mImmersiveStatusBar.setStatusTextAndIconColor(true);
mImmersiveStatusBar.setColorBar(ContextCompat.getColor(this, R.color.white));
} else {
mImmersiveStatusBar.setColorBar(ContextCompat.getColor(this, R.color.black));
}
}