解决自定义状态栏对软键盘及界面内容遮挡问题
2015-09-28 18:48
405 查看
本文主要解决的问题是《自定义状态栏》一文所遇到的问题:
自定义状态栏遮挡Activity显示内容及状态栏在底部时,自定义状态栏遮挡界面弹出的软键盘问题?
主要是因为通过WindowManager添加的视图指定了以下类型
TYPE_PHONE类型在被添加时指定的Zindex比Activity的RootView的Zindex大。
解决思路
根据第1步分析的结果,即自定义状态栏与Activity所显示的视图不在同一Zindex.
所以只能通过调整Activity的PaddingBottom来填充底部使其内容底边与自定义状态栏的顶部连接。对用户所看到的效果就像在同一界面,且不会遮挡。
实现
建立所有Activity的基类BaseActivity,在BaseActivity中定义所有Activity的RootView,设置RootView的PaddingBottom=自定义状态的高度
原因同1
解决思路
第一步:
在键盘弹出时的时候将状态栏隐藏,键盘隐藏时将状态栏显示出来。
那么,问题就聚焦在怎么知道键盘状态的改变(显示/隐藏)
网上有很多人写到使用以下代码判断,本人亲试,要么一直返回true,要么一直返回false
本人解决办法是在OverStackFlow上大牛回复中找到的,具体地址没有找到。
在上面提到的BaseActivity建立自定义根视图MyRelativeLayout,所有的Activity内容都增加到此视图的子视图中。当软键盘弹出时会调用视图的onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法,来判断软键盘是否弹出。
第二步
当获取到了软键盘的状态变化后通知状态栏做显示隐藏就ok
大家期待已久的代码来了,前段时间因为忙,那真是借口(这里感谢”hu441448238xin”提的增加源码的建议,一直没有增加,我感到很抱歉,赶在清明在家增加了项目源码)[]https://github.com/canney-chen/CustomStatusBar]
自定义状态栏遮挡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]
相关文章推荐
- 4-1 Deque (25分)
- Java反射机制 和 泛型函数设计
- shell简介
- Mac OS X 在捕捉AppLAN通信包
- oracle分布式事务总结-转载
- get与post的区别
- 测试atlas
- CentOS 6.6下安装OpenOffice4.0
- hdu 5492 Find a path
- iOS适配各版本
- 【python】matplotlib在windows10 和win7下安装
- Android 最火的快速开发框架XUtils
- 职场人生的故事篇
- 1026:Ignatius and the Princess I
- nyoj 119 士兵杀敌(三)【线段树区间最大值最小值差】
- noip2011 聪明的质监员 (二分+前缀和处理+读入优化)
- mysql 排序 特殊数据置顶
- Exception in thread "main" org.openqa.selenium.remote.SessionNotFoundException
- 关于ViewPager+Fragment配合使用时的几个要点
- ActionBar 添加自定义控件居中