11

私はそれActivityにシングルを持っFragmentています。EditTextフラグメントに1 つあります。

フラグメントが表示されるとすぐにキーボードがポップアップしますが、マニフェスト android:windowSoftInputMode="stateHidden" で設定をブロックすることができました

ただし、別の EditText でダイアログを開くボタンもあります。

ダイアログの終了時にキーボードを自動的に閉じるメソッドがあります。

public static void closeInput(final View caller) {      
    caller.post(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
        }
    });
}

この方法はかなりハックではなく、何か問題があります。ダイアログEditTextにはinputType="numberDecimal". はcloseInput()キーボードを閉じていないようで、デフォルトのアルファベット状態に変更しているだけです。

ここで何が起こっているのですか?

4

7 に答える 7

7

BaseDialog.java で

protected void hideSoftKeyboard() {
    InputMethodManager imm = (InputMethodManager) this.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm.isActive()) {
        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
    }
}
于 2015-01-28T06:24:43.027 に答える
1

私の場合、解決策は、キーボードを非表示にしてダイアログを閉じることでした

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
            View view = activity.getCurrentFocus();
            if (view != null) {
                InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    }); 
于 2015-09-18T09:48:27.770 に答える
1

この問題に苦労し、ここで回答を確認した後、ほとんどが実際に機能しているようです. 単なるビルダーではなくクラスを使用することは望ましくなかったため、答えhttps://stackoverflow.com/a/36422411/1815624は実行可能なソリューションではありません。

他の人がこの同じ問題を抱えている可能性があることに気づき、答えは両方から導き出されてい ます:

したがって、組み合わせの答えは、フラグメント自体からビューを取得することです:

(やらない理由がある人はいますか?)

void closeKeyboard(final View caller){
    caller.post(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) caller.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(caller.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    });
}

...

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        closeKeyboard(getView());
    }
});
于 2017-01-11T09:03:54.947 に答える
0

ダイアログキーボードを非表示にする簡単な方法を見つけました

  1. dialog.setCanceledOnTouchOutside(false)
  2. ダイアログを閉じる前にhideKeyboardFromDialogBeforeDismiss() を呼び出します。キャンセル ボタンのクリック イベントが発生している可能性があります。onDismiss または onCancelListener で呼び出すべきではありません。
    binding.cancelBtn.setOnClickListener {       
        STSystemUtil.hideKeyboardFromDialogBeforeDismiss(dialog = dialog) 
        binding.root.postDelayed({ dialog?.dismiss() }, 200)
    }
    
    @JvmStatic
    @JvmOverloads
    fun getInputMethodManager(context: Context? = STInitializer.application()): InputMethodManager? {
        return context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    }

    /*
     * 注意: 如果 dialog 包含一个或者多个EditText, 点击外部(canceledOnTouchOutside==true)不会隐藏已经显示的输入法弹框, 且通过点击取消按钮必须先隐藏输入法弹框再延时 dismiss, 因为在 onCancel/onDismiss 中 dialog?.currentFocus?.windowToken 必然已经是 null, 且 inputMethodManager?.isActive 必然是 false
     * ----> canceledOnTouchOutside = false
     * ----> binding.cancelBtn.setOnClickListener {
     *          STSystemUtil.hideKeyboardFromDialogBeforeDismiss(dialog)
     *          binding.root.postDelayed({ dialog?.dismiss() }, 200)
     *       }
     */
    @JvmStatic
    @JvmOverloads
    fun hideKeyboardFromDialogBeforeDismiss(context: Context? = STInitializer.application(), dialog: Dialog? = null) {
        val inputMethodManager: InputMethodManager? = getInputMethodManager(context)
        if (dialog == null) {
            if (inputMethodManager?.isActive == true) {
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)
            }
        } else {
            inputMethodManager?.hideSoftInputFromWindow(dialog.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    }
于 2021-01-07T05:09:31.627 に答える