本文主要解决的问题是《自定义状态栏》一文所遇到的问题:
自定义状态栏遮挡Activity显示内容及状态栏在底部时,自定义状态栏遮挡界面弹出的软键盘问题?
解决自定义状态栏遮挡界面内容
为什么会出现遮挡问题呢?
主要是因为通过WindowManager添加的视图指定了以下类型statusBarParams.type = LayoutParams.TYPE_PHONE
TYPE_PHONE类型在被添加时指定的Zindex比Activity的RootView的Zindex大。
- 解决思路
根据第1步分析的结果,即自定义状态栏与Activity所显示的视图不在同一Zindex.
所以只能通过调整Activity的PaddingBottom来填充底部使其内容底边与自定义状态栏的顶部连接。对用户所看到的效果就像在同一界面,且不会遮挡。 - 实现
建立所有Activity的基类BaseActivity,在BaseActivity中定义所有Activity的RootView,设置RootView的PaddingBottom=自定义状态的高度
解决自定义状态栏遮挡界面弹出的软键盘
- 为什么出现遮挡问题呢?
原因同1 解决思路
第一步:
在键盘弹出时的时候将状态栏隐藏,键盘隐藏时将状态栏显示出来。
那么,问题就聚焦在怎么知道键盘状态的改变(显示/隐藏)网上有很多人写到使用以下代码判断,本人亲试,要么一直返回true,要么一直返回false
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.isActive()
本人解决办法是在OverStackFlow上大牛回复中找到的,具体地址没有找到。
在上面提到的BaseActivity建立自定义根视图MyRelativeLayout,所有的Activity内容都增加到此视图的子视图中。当软键盘弹出时会调用视图的onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法,来判断软键盘是否弹出。
/**
* 做为布局的根节点时,当软键盘弹出或隐藏时会调用{@link OnKeyboardChangedListener#onKeyboardStateChanged(int)}
* @author ChenQiang
* @date 2015年5月28日 上午11:47:03
*
*/
public class MyRelativeLayout extends RelativeLayout {
private OnKeyboardChangedListener mListener;
public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyRelativeLayout(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diff = (screenHeight - statusBarHeight) - height;
if (mListener != null) {
mListener.onKeyboardStateChanged(diff>128); // assume all soft keyboards are at least 128 pixels high
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public interface OnKeyboardChangedListener {
public void onKeyboardStateChanged(boolean show);
}
}
第二步
当获取到了软键盘的状态变化后通知状态栏做显示隐藏就ok
大家期待已久的代码来了,前段时间因为忙,那真是借口(这里感谢”hu441448238xin”提的增加源码的建议,一直没有增加,我感到很抱歉,赶在清明在家增加了项目源码)[https://github.com/canney-chen/CustomStatusBar]