【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协调的问题
来源:互联网 发布:重骑兵 知乎 编辑:程序博客网 时间:2024/05/20 19:33
项目中有个评论的需求,根据需求决定使用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); } }
0 0
- 【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协调的问题
- Android Editext 点击两次后软键盘遮挡 Editext控件的问题
- editext通过接口回调弹出软键盘实现说说评论
- Android评论发图功能实现以及软键盘的监听和获得软键盘的高度
- Android Dialog弹出时的软键盘弹出问题
- 解决自定义Dialog无法弹出软键盘的问题
- 解决Android Dialog 和软键盘共存
- Editext不弹出软键盘的方法
- Android评论功能的实现
- editext文本输入框 软键盘下个按钮的问题
- dialog 自动弹出软键盘的问题
- Dialog与软键盘共存的问题
- 解决dialog中嵌套EditText,自动弹出软键盘的问题
- 自定义的AlertDialog获取软键盘和editext中的内容
- 【Android】使用SearchView时软键盘不支持actionSearch的问题
- 说一说怎样实现Android评论功能的
- Android模仿软键盘实现软键盘的删除功能(逐个删除EditText的输入元素)
- Android模仿软键盘实现软键盘的删除功能(逐个删除EditText的输入元素)
- 使用openlivewrite发布的博客,csdn的metaweblog的网址
- ResNet详解
- 缓存
- ubuntu 英伟达显卡驱动安装攻略
- 环境变量
- 【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协调的问题
- VR
- 对话框Dialog使用总结
- 热修复技术初探(二)
- 移动前端自适应解决方案和比较
- HTTP协议——建立连接/请求和响应
- 为什么Netflix的API网关要升级为异步非阻塞架构?
- [datatables -- 学习02]: datatables 导出 CSV和excel 文件,甚至copy内容
- python sqlalchemy模块默认值插入问题