最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年01月09日 17:14:05   作者:豬豬上  
這篇文章主要介紹了dialog dismiss時鍵盤不消失的問題淺析及兩種解決方法,非常不錯,具有參考借鑒價值,需要的朋友參考下

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

如圖

如圖

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

但是發(fā)現(xiàn)大多數(shù)手機都不會隱藏(魅族x4會隱藏)。

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

經(jīng)過測試,發(fā)現(xiàn)edittext.getWindowToken()為null。

 /**
   * 關(guān)閉鍵盤
   *
   * @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 方法執(zhí)行的時候,dialog已經(jīng)消失了。已經(jīng)獲取不到windowToken了。

目前發(fā)現(xiàn)有兩種方式覺得這樣的問題

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之前就隱藏軟鍵盤,因為設(shè)置setCancelOnTouchOutside(true),會響應(yīng)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));
  }
   // 關(guān)閉鍵盤
  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);
    }
  }

經(jīng)測試,以上兩種方法都可以關(guān)閉軟鍵盤。

另外附在dialog啟動時彈出軟鍵盤代碼,重寫onStart方法

@Override
  protected void onStart() {
    super.onStart();
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  }

以上所述是小編給大家介紹的dialog dismiss時鍵盤不消失的問題淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

您可能感興趣的文章:

相關(guān)文章

最新評論

佛山市| 綦江县| 黄大仙区| 辽阳市| 福鼎市| 聂拉木县| 扶风县| 凌源市| 荥阳市| 唐海县| 贡觉县| 独山县| 墨玉县| 隆尧县| 通榆县| 桐城市| 寿宁县| 台安县| 蓝田县| 彰化市| 晋宁县| 介休市| 清水县| 清水河县| 石家庄市| 探索| 松潘县| 银川市| 阳东县| 镶黄旗| 广南县| 南召县| 合山市| 水城县| 罗定市| 桦南县| 柳林县| 泸州市| 齐齐哈尔市| 神农架林区| 交口县|