【Android】解决使用Dialog + EdiText 实现评论功能时,软键盘不协调的问题

    xiaoxiao2021-03-25  156

    项目中有个评论的需求,根据需求决定使用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); } }
    转载请注明原文地址: https://ju.6miu.com/read-3621.html

    最新回复(0)