Android沉浸式状态栏实现

沉浸式状态栏是Android4.4以后才出现的概念,为了解决以前统一不变的黑色状态栏。最具有代表性的就是QQ的页面,如图:



网上实现沉浸式状态栏的方法基本是设置状态栏为透明:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow();
            // Translucent status bar
            window.setFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }


然后在XML的跟元素中设置 :

android:fitsSystemWindows="true"


这样基本就搞定了。但是有问题就是颜色不能自定义。于是就自己搞了套沉浸式的代码。


BaseActivity.java

	<pre name="code" class="java"><span style="white-space:pre">	</span>@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		
		if (isImmerse())
		{
			//透明状态栏
			getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
			//透明导航栏
			getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
		}
	}

	protected boolean isImmerse()
	{
		return VERSION.SDK_INT >= VERSION_CODES.KITKAT;
	}

 


BaseNoToolBarActivity.java
public class BaseNoToolBarActy extends BaseActy
{

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

	@Override
	public void setContentView(int layoutResID)
	{
		super.setContentView(layoutResID);

		if (isImmerse())
		{
			setImmersePaddingTop();
		}
	}

	/**
	 * 设定子View距离顶部的距离,空出状态栏的距离
	 */
	protected void setImmersePaddingTop()
	{
		ViewGroup viewGroup = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
		viewGroup.setPadding(0, DisplayUtil.getStatusBarHeight(this), 0, 0);
	}
}

BaseToolBarActivity.java

<pre name="code" class="html">public class BaseToolBarActy extends BaseActy
{

	private View		actionBarView;			//自定义的ActionBar的布局
	private TextView	actionbarTitleView;	//标题
	private TextView	actionbarExtraView;	//预制按钮一
	private TextView	actionbarExtra2View;	//预制按钮二

	/*
	* 两个属性
	* 1、toolbar是否悬浮在窗口之上
	* 2、toolbar的高度获取
	* */
	public static int[]	ATTRS	= {
								R.attr.windowActionBarOverlay,
								R.attr.actionBarSize
								};

	public Toolbar		toolbar;

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

	@Override
	public void setContentView(int layoutResID)
	{
		super.setContentView(initToolBar(layoutResID));
		setSupportActionBar(toolbar);
	}

	@Override
	public void setContentView(View view)
	{
		super.setContentView(initToolBar(view));
		setSupportActionBar(toolbar);
	}

	private FrameLayout initToolBar(int layoutResID)
	{
		View userView = LayoutInflater.from(this).inflate(layoutResID, null);
		return initToolBar(userView);
	}

	private FrameLayout initToolBar(View userView)
	{
		/*直接创建一个帧布局,作为视图容器的父容器*/
		FrameLayout contentView = new FrameLayout(this);

		/*将toolbar引入到父容器中*/
		View toolbarLay = LayoutInflater.from(this).inflate(R.layout.toolbar, null);
		FrameLayout.LayoutParams layParam = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		contentView.addView(toolbarLay, layParam);

		//不明原因导致布局向右移动了一些,移动回来
		((FrameLayout.LayoutParams) toolbarLay.getLayoutParams()).leftMargin = -40;
		toolbar = (Toolbar) toolbarLay.findViewById(R.id.id_tool_bar);
		if (isImmerse())
		{
			int statusBarHeight = DisplayUtil.getStatusBarHeight(this);
			toolbar.setPadding(0, statusBarHeight, 0, 0);
			toolbar.getLayoutParams().height += statusBarHeight;

			//增加20%透明度的背景栏
			View view = new View(this);
			view.setBackgroundColor(Color.parseColor("#33000000"));
			contentView.addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, statusBarHeight));
		}
		actionBarView = getLayoutInflater().inflate(R.layout.actionbar_baseview, toolbar);
		actionbarTitleView = (TextView) actionBarView.findViewById(R.id.actionbar_title);
		actionbarExtraView = (TextView) actionBarView.findViewById(R.id.actionbar_extra);
		actionbarExtra2View = (TextView) actionBarView.findViewById(R.id.actionbar_extra2);
		actionbarTitleView.setVisibility(View.GONE);
		actionbarExtraView.setVisibility(View.GONE);
		actionbarExtra2View.setVisibility(View.GONE);
		BaseClickListener clickListener = new BaseClickListener();
		actionbarTitleView.setOnClickListener(clickListener);
		actionbarExtraView.setOnClickListener(clickListener);
		actionbarExtra2View.setOnClickListener(clickListener);

		/*将自定义的布局引入到父容器中*/
		FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
		TypedArray typedArray = getTheme().obtainStyledAttributes(ATTRS);
		/*获取主题中定义的悬浮标志*/
		boolean overly = typedArray.getBoolean(0, false);
		/*获取主题中定义的toolbar的高度*/
		int toolBarSize = toolbar.getLayoutParams().height;
		typedArray.recycle();
		/*如果是悬浮状态,则不需要设置间距*/
		params.topMargin = overly ? 0 : toolBarSize;
		contentView.addView(userView, params);

		return contentView;
	}

	/**
	 * 设置ActionBar的标题
	 * 
	 * @param title	:ActionBar的标题
	 */
	public void setActionbarTitle(String title)
	{
		if (FCStringUtil.isNotEmpty(title))
		{
			actionbarTitleView.setText(title);
			actionbarTitleView.setVisibility(View.VISIBLE);
		} else
		{
			actionbarTitleView.setText(null);
			actionbarTitleView.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar标题的背景图片
	 * 
	 * @param res :资源ID
	 */
	public void setActionbarTitleBackground(int res)
	{
		actionbarTitleView.setBackgroundResource(res);
		actionbarTitleView.setVisibility(View.VISIBLE);
	}

	/**
	 * 设置ActionBar的预置按钮长按可用
	 */
	public void setLongClickEnable()
	{
		BaseLongClickListener longClickListener = new BaseLongClickListener();
		actionbarTitleView.setOnLongClickListener(longClickListener);
		actionbarExtraView.setOnLongClickListener(longClickListener);
		actionbarExtra2View.setOnLongClickListener(longClickListener);
	}

	/**
	 * 设置ActionBar的预置按钮长按不可用
	 */
	public void setLongClickDisable()
	{
		actionbarTitleView.setOnLongClickListener(null);
		actionbarExtraView.setOnLongClickListener(null);
		actionbarExtra2View.setOnLongClickListener(null);
	}

	/**
	 * 设置ActionBar标题的背景图片
	 * 
	 * @param able : 标题显示图片Drawable对象
	 */
	@SuppressWarnings("deprecation")
	public void setActionbarTitleBackground(Drawable able)
	{
		if (able != null)
		{
			actionbarTitleView.setBackgroundDrawable(able);
			actionbarTitleView.setVisibility(View.VISIBLE);
		} else
		{
			actionbarTitleView.setBackgroundDrawable(null);
			actionbarTitleView.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar预制按钮一的文字
	 * 
	 * @param extra	: 显示的文字
	 */
	public void setActionbarExtra(String extra)
	{
		if (FCStringUtil.isNotEmpty(extra))
		{
			actionbarExtraView.setText(extra);
			actionbarExtraView.setVisibility(View.VISIBLE);
		} else
		{
			actionbarExtraView.setText(null);
			actionbarExtraView.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar预制按钮一的图片
	 * 
	 * @param res : 按钮显示图片资源ID
	 */
	public void setActionbarExtraBackground(int res)
	{
		actionbarExtraView.setBackgroundResource(res);
		actionbarExtraView.setVisibility(View.VISIBLE);
	}

	/**
	 * 设置ActionBar预制按钮一的图片
	 * 
	 * @param able : 按钮显示图片
	 */
	@SuppressWarnings("deprecation")
	public void setActionbarExtraBackground(Drawable able)
	{
		if (able != null)
		{
			actionbarExtraView.setBackgroundDrawable(able);
			actionbarExtraView.setVisibility(View.VISIBLE);
		} else
		{
			actionbarExtraView.setBackgroundDrawable(null);
			actionbarExtraView.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar预制按钮二的文字
	 * 
	 * @param extra : 按钮显示的文字
	 */
	public void setActionbarExtra2(String extra)
	{
		if (FCStringUtil.isNotEmpty(extra))
		{
			actionbarExtra2View.setText(extra);
			actionbarExtra2View.setVisibility(View.VISIBLE);
		} else
		{
			actionbarExtra2View.setText(null);
			actionbarExtra2View.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar预制按钮二的图片
	 * 
	 * @param res	显示的资源ID
	 */
	public void setActionbarExtra2Background(int res)
	{
		actionbarExtra2View.setBackgroundResource(res);
		actionbarExtra2View.setVisibility(View.VISIBLE);
	}

	/**
	 * 设置ActionBar预制按钮二的图片
	 * 
	 * @param able	显示的Drawable对象
	 */
	@SuppressWarnings("deprecation")
	public void setActionbarExtra2Background(Drawable able)
	{
		if (able != null)
		{
			actionbarExtra2View.setBackgroundDrawable(able);
			actionbarExtra2View.setVisibility(View.VISIBLE);
		} else
		{
			actionbarExtra2View.setBackgroundDrawable(null);
			actionbarExtra2View.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置ActionBar的背景颜色 
	 * 
	 * @param color	颜色值
	 */
	public void setActionBarBackBroundColor(int color)
	{
		actionBarView.setBackgroundColor(color);
	}

	/**
	 * 设置ActionBar的背景资源 
	 * 
	 * @param res	资源ID
	 */
	public void setActionBarBackBroundRes(int res)
	{
		actionBarView.setBackgroundResource(res);
	}

	/**
	 * 获取Actionbar的标题控件
	 * 
	 * @return 标题控件
	 */
	public TextView getActionbarTitleView()
	{
		return actionbarTitleView;
	}

	/**
	 * 获取Actionbar的预制按钮一
	 * 
	 * @return 预制按钮一控件
	 */
	public TextView getActionbarExtraView()
	{
		return actionbarExtraView;
	}

	/**
	 * 获取Actionbar的预制按钮二
	 * 
	 * @return 预制按钮二控件
	 */
	public TextView getActionbarExtra2View()
	{
		return actionbarExtra2View;
	}

	/**
	 * 预制按钮一点击回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarExtraClick()
	{}

	/**
	 * 预制按钮二点击回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarExtra2Click()
	{}

	/**
	 * 标题按钮点击回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarTitleClick()
	{}

	/**
	 * 预制按钮一长按回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarExtraLongClick()
	{}

	/**
	 * 预制按钮二长按回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarExtra2LongClick()
	{}

	/**
	 * 标题长按回调,子类如需要处理点击事件,重写此方法
	 */
	protected void onActionbarTitleLongClick()
	{}

	/*
	 * 预置按钮的点击事件类 
	 */
	private class BaseClickListener implements OnClickListener
	{

		@Override
		public void onClick(View v)
		{
			if (v.getId() == R.id.actionbar_title)
			{
				onActionbarTitleClick();
			} else if (v.getId() == R.id.actionbar_extra)
			{
				onActionbarExtraClick();
			} else if (v.getId() == R.id.actionbar_extra2)
			{
				onActionbarExtra2Click();
			}
		}
	}

	/*
	 * 预制按钮的 长按事件类
	 */
	private class BaseLongClickListener implements OnLongClickListener
	{

		@Override
		public boolean onLongClick(View v)
		{
			if (v.getId() == R.id.actionbar_title)
			{
				onActionbarTitleLongClick();
			} else if (v.getId() == R.id.actionbar_extra)
			{
				onActionbarExtraLongClick();
			} else if (v.getId() == R.id.actionbar_extra2)
			{
				onActionbarExtra2LongClick();
			}
			return true;
		}
	}
}


 这样如果有像主页这样不需要ToolBar的,继承BaseNoToolBarActivity, 而需要的继承BaseToolBarActivity就可以了。 




具体代码请看我GitHub项目,这是项目的一部分

 https://github.com/wl549388372/PhoneRedmine




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值