dialog dismiss 시 키보드 가 사라 지지 않 는 문제 에 대한 분석 및 해결 방법

4setCanceledOnTouchOutside(true)그림자,dialog dismiss 를 클릭 할 때 키보드 가 사라 지지 않 는 문제.
그림 과 같다
如图
처음에는 간단 하 다 고 생각 했 는데 감청 해 보 세 요onDimiss()방법 은 안에 키 보드 를 숨 기 면 되 잖 아 요.
하지만 대부분의 휴대 전 화 는 숨 기지 않 는 다.
왜 그 럴 까요?왜 키보드 가 사라 지지 않 습 니까?
테스트 를 통 해 발견 되 었 습 니 다edittext.getWindowToken()null 입 니 다.

 /**
   *     
   *
   * @param context
   * @param et
   */
  public static void hideKeyboard(Context context, EditText et) {
    InputMethodManager imm = (InputMethodManager) context
        .getSystemService(Context.INPUT_METHOD_SERVICE);
    LogUtils.showLog("hideKeyboard  imm.isActive() = "+imm.isActive()+"    et.getWindowToken() = "+et.getWindowToken());
    if (imm.isActive()) {
      imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
    }
  }
这里写图片描述
ondismiss 방법 이 실 행 될 때 dialog 가 사 라 졌 기 때문이다.windowToken 을 가 져 올 수 없습니다.
지금 은 두 가지 방식 으로 이런 문 제 를 느끼 는 것 으로 나 타 났 다.
1.ondismiss()방법 에 소프트 키 보드 를 이렇게 숨 깁 니 다.

 @Override
  public void onDismiss(DialogInterface dialog) {
    InputMethodManager inputMgr = (InputMethodManager) context
        .getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
  }
2.dismiss 이전에 소프트 키 보드 를 숨 깁 니 다.setCancel OnTouch Outside(true)를 설정 하면 Dialog 류 의 onTouch 방법 에 응답 하기 때 문 입 니 다.

public boolean onTouchEvent(MotionEvent event) {
    if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) {
      cancel();
      return true;
    }
    return false;
  }
/**
   * Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will
   * also call your {@link DialogInterface.OnCancelListener} (if registered).
   */
  public void cancel() {
    if (!mCanceled && mCancelMessage != null) {
      mCanceled = true;
      // Obtain a new message so this dialog can be re-used
      Message.obtain(mCancelMessage).sendToTarget();
    }
    dismiss();
  }
onTouch()방법 을 다시 쓰 면 됩 니 다.코드 는 다음 과 같다.

 @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (isShowing() && shouldCloseOnTouch(getContext(),event)){
      ViewHelper.hideKeyboard(context, et_reply_comment);
    }
    return super.onTouchEvent(event);
  }
  public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN
        && isOutOfBounds(context, event) && getWindow().peekDecorView() != null) {
      return true;
    }
    return false;
  }
  private boolean isOutOfBounds(Context context, MotionEvent event) {
    final int x = (int) event.getX();
    final int y = (int) event.getY();
    final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
    final View decorView = getWindow().getDecorView();
    return (x < -slop) || (y < -slop)
        || (x > (decorView.getWidth()+slop))
        || (y > (decorView.getHeight()+slop));
  }
   //     
  public static void hideKeyboard(Context context, EditText et) {
    InputMethodManager imm = (InputMethodManager) context
        .getSystemService(Context.INPUT_METHOD_SERVICE);
    LogUtils.showLog("hideKeyboard  imm.isActive() = "+imm.isActive()+"    et.getWindowToken() = "+et.getWindowToken());
    if (imm.isActive()) {
      imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
    }
  }
테스트 를 통 해 상기 두 가지 방법 은 모두 소프트 키 보드 를 닫 을 수 있다.
또한 dialog 시작 시 소프트 키보드 코드 를 꺼 내 onStart 방법 을 다시 씁 니 다.

@Override
  protected void onStart() {
    super.onStart();
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  }
위 에서 말 한 것 은 편집장 이 소개 한 dialog dismiss 시 키보드 가 사라 지지 않 는 문제 에 대한 간단 한 분석 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기