在按钮上(在“活动”中)单击打开警报对话框,包含edittext,因此我希望当用户在警告对话框键盘外部单击时应该隐藏

时间:2018-03-20 08:35:30

标签: android alertdialog android-softkeyboard android-touch-event

  

外部点击警告对话框隐藏键盘但对话框应保持不变,   我正在检查运动事件但没有工作

@Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
View v = getCurrentFocus();

if (v != null && 
        (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == 
MotionEvent.ACTION_MOVE) && 
        v instanceof EditText && 
        !v.getClass().getName().startsWith("android.webkit.")) {
    int scrcoords[] = new int[2];
    v.getLocationOnScreen(scrcoords);
    float x = ev.getRawX() + v.getLeft() - scrcoords[0];
    float y = ev.getRawY() + v.getTop() - scrcoords[1];

    if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
        hideKeyboard(this);
}
    return super.dispatchTouchEvent(ev);
}
  

隐藏键盘

 public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
  }
}

1 个答案:

答案 0 :(得分:1)

您可以使用对话框代替警告对话框,可以执行以下操作。

public void showNotAvailableDialog() {
        final EditText input = new EditText(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        input.setLayoutParams(lp);
        Dialog dialog= new Dialog(this) {
            @Override
            public boolean dispatchTouchEvent(@NonNull MotionEvent motionEvent) {
                if (getCurrentFocus() != null) {
                    InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                }
                return super.dispatchTouchEvent(motionEvent);
            }
        };
        dialog.setCanceledOnTouchOutside(false);
        dialog.setContentView(input);
        dialog.show();
    }