dialog dismiss 시 키보드 가 사라 지지 않 는 문제 에 대한 분석 및 해결 방법
setCanceledOnTouchOutside(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 시 키보드 가 사라 지지 않 는 문제 에 대한 간단 한 분석 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Dialog pops up in ApplicationIn the daily development process, it is often necessary to control some information on a global scale. For example, netw...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.