国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

dialog dismiss時鍵盤不消失的問題淺析及解決辦法

2019-12-12 04:04:23
字體:
來源:轉載
供稿:網友

setCanceledOnTouchOutside(true),點擊陰影處,dialog dismiss時鍵盤不消失的問題。

如圖

如圖

一開始覺得很簡單,監聽下onDimiss()方法,在里面隱藏鍵盤不就行了。

但是發現大多數手機都不會隱藏(魅族x4會隱藏)。

這是為什么呢?為什么鍵盤不消失呢?

經過測試,發現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之前就隱藏軟鍵盤,因為設置setCancelOnTouchOutside(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時鍵盤不消失的問題淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰考县| 且末县| 龙海市| 易门县| 华阴市| 武夷山市| 宣恩县| 军事| 青川县| 宁陕县| 铁岭市| 武穴市| 无为县| 兰西县| 体育| 康马县| 丽江市| 临湘市| 长岭县| 镇巴县| 福海县| 天全县| 沧州市| 绥滨县| 潜江市| 京山县| 民丰县| 满洲里市| 宁夏| 泾阳县| 日喀则市| 桂东县| 靖宇县| 佛坪县| 衡南县| 五家渠市| 东乌珠穆沁旗| 翁源县| 潮安县| 大悟县| 金湖县|