Android沉浸式的状态栏的简单实现

最近实现了沉浸式的状态栏,记录下来自己实现的方法,方便回顾

1.先是创建工具类,在这个类中获取到状态栏的高度,设置想要设置的状态栏背景

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;


public class ImmerseHelper {
	@TargetApi(Build.VERSION_CODES.LOLLIPOP)
	public static void setSystemBarTransparent(Activity paramActivity,int icon) {
		Window window = paramActivity.getWindow();
		WindowManager.LayoutParams layoutParams = window.getAttributes();


		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
			// api 21 解决方案
			View systemdecor = window.getDecorView();
			systemdecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
			layoutParams.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
			window.setStatusBarColor(0x00000000);
		} else {
			// api 19 解决方案
			layoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
		}
		window.setAttributes(layoutParams);

		hackStatusBarTransparent(paramActivity,icon);
		setContentPadding(paramActivity);

	}


	public static void hackStatusBarTransparent(Activity paramActivity,int icon) {
		ViewGroup localViewGroup = (ViewGroup) paramActivity.getWindow().getDecorView()
				.findViewById(android.R.id.content);
		View colorview = new View(paramActivity);
		colorview.setBackgroundResource(icon);//设置状态栏的背景
		localViewGroup.addView(colorview, ViewGroup.LayoutParams.MATCH_PARENT,
				ImmerseHelper.getStatusBarHeight(paramActivity));
	}


	public static void setContentPadding(Activity activity) {
		((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0).setPadding(0,
				ImmerseHelper.getStatusBarHeight(activity), 0, 0);
	}


	/**
	 * 获取状态栏高度, 单位px
	 * 
	 * @param context
	 * @return
	 */
	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;
	}


	/**
	 * 获取actionbar高度, 单位px
	 * 
	 * @param context
	 * @return
	 */
	public static int getActionBarHeight(Context context) {
		TypedValue localTypedValue = new TypedValue();
		if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, localTypedValue, true)) {
			return TypedValue.complexToDimensionPixelSize(localTypedValue.data,
					context.getResources().getDisplayMetrics());
		}
		return 0;
	}
}

2.onPostCreate方法是指onCreate方法彻底执行完毕的回调,在需要实现沉浸式状态栏的Activity的onPostCreate方法中调用这个ImmerseHelper类的setSystemBarTransparent方法即可

@Override

    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)  {
        ImmerseHelper.setSystemBarTransparent(this,R.id.drawable.actionbar_shape);//传入activity和背景资源
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_29518175/article/details/79112974
今日推荐