沉浸式状态栏是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);
}
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;
}
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