【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协调的问题
2017-03-08 16:29
441 查看
项目中有个评论的需求,根据需求决定使用Dialog作为评论窗口的载体,一开始觉得很简单的事情,但是却出现了与软键盘协调的问题,现做记录,防止遗忘。
点击输入框其他区域则隐藏输出窗和软键盘
在构造方法设置主题
在
重写
解决点击空白处Dialog与软键盘同时消失
需求描述
当处于输入状态时,第一次点击返回按钮隐藏键盘,第二次点击在隐藏输入窗点击输入框其他区域则隐藏输出窗和软键盘
主要代码
首先我们要自定义样式:<!-- 自定Dialog 主题style --> <style name="MyDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> //无边框 <item name="android:windowIsFloating">true</item> //处于浮动状态 <item name="android:windowIsTranslucent">false</item> //不是半透明的 <item name="android:windowNoTitle">true</item> //没有标题栏 <item name="android:background">@null</item> //背景为空 <item name="android:windowBackground">@android:color/transparent</item> //背景色为透明 </style>
在构造方法设置主题
public VideoCommentDialog(@NonNull Context context) { super(context, R.style.MyDialog); }
在
onCreate()中手动指定Dailog位置,大小
android.view.WindowManager.LayoutParams lp = this.getWindow().getAttributes(); lp.width = LinearLayout.LayoutParams.MATCH_PARENT; lp.gravity = Gravity.BOTTOM; this.getWindow().setAttributes(lp);
重写
show()和
dismiss()方法
@Override public void show() { super.show(); showKeyboard(); } @Override public void dismiss() { HideSoftInput(mEditText.getWindowToken());//一定要在父类的执行dismiss之前隐藏键盘,不然 mEditText.getWindowToken() 就会为空。从而无法隐藏 super.dismiss(); }
解决点击空白处Dialog与软键盘同时消失
// 获取点击事件 @Override public boolean dispatchTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub if (ev.getAction() == MotionEvent.ACTION_DOWN) { View view = getCurrentFocus(); if (isHideInput((View) view.getParent(), ev)) { //此处使用的是 LinearLayout 布局承载了 EdiText和Button,所以要判断点击的是否是这个LinearLayout以外的部分。 HideSoftInput(mEditText.getWindowToken()); } } return super.dispatchTouchEvent(ev); } // 判定是否需要隐藏 private boolean isHideInput(View v, MotionEvent ev) { if (v != null && (v instanceof LinearLayout)) { int[] l = {0, 0}; v.getLocationInWindow(l); int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); if (ev.getX() > left && ev.getX() < right && ev.getY() > top && ev.getY() < bottom) { return false; } else { return true; } } return false; } // 隐藏软键盘 private void HideSoftInput(IBinder token) { if (token != null) { InputMethodManager manager = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); manager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } }
相关文章推荐
- android 使用Dialog实现Toast效果,解决有的机型不显示Toast的问题(保证能用)
- Android软键盘使用及输入法挡住输入框的问题解决
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 关于android程序中使用bitmap放大功能时的OOM问题解决方法
- Android实现dialog时候弹出软键盘dialog移位问题
- Android Activity使用Dialog样式导致点击空白处自动关闭的问题解决
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- android使用GestureDetector实现手势下滑与ListView onTouchEvent 冲突问题 解决
- 使用struts2实现下载功能遇到的文件中文问题解决经验分享
- android使用Dialog实现复选功能与数据库结合综合实例
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 【转】Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信