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

本文主要解决的问题是《自定义状态栏》一文所遇到的问题:
自定义状态栏遮挡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]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值