您的位置:首页 > 其它

解决自定义状态栏对软键盘及界面内容遮挡问题

2015-09-28 18:48 405 查看
本文主要解决的问题是《自定义状态栏》一文所遇到的问题:

自定义状态栏遮挡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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: