web-dev-qa-db-ja.com

edittextの外で1回タップするだけでキーボードを非表示にする方法は?

Edittextの外側をタップしてキーボードを非表示にしたい。これは私のxmlコードです:

<RelativeLayout
Android:clickable="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:onClick="rl_main_onClick">
<RelativeLayout
  //Here there are some widgets including some edittext.
</RelativeLayout>

これは私のJavaコード(MainActivity)です:

public void rl_main_onClick(View view) {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

しかし、キーボードを非表示にするには、2回タップする必要があります。最初のタップは「次へ」(最後のedittextの場合は「完了」)を「入力」アイコンに変更し、次に2回目のタップでキーボードを非表示にします。これは最初のタップで何が起こるかです:

What the first tap does.

今私は2つの質問があります:

  1. ワンタップで修正してキーボードを非表示にするにはどうすればよいですか?

  2. すべてのedittext(すべてに対して1つのコード)に対してそれを行うことは可能ですか?

onClickonTouchに置き換えてみてください。そのためには、次のようにレイアウト属性を変更する必要があります。

_<RelativeLayout
    Android:id="@+id/relativeLayout"
    Android:clickable="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true">

    <RelativeLayout>

        // widgets here

    </RelativeLayout>

</RelativeLayout>
_

次に、rl_main_onClick(View view) {...}メソッドを削除し、onTouchリスナーメソッドをonCreate()内に挿入します。

_findViewById(R.id.relativeLayout).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }
});
_
12
Marat

拡張子付きのKotlinバージョン

fun View.hideKeyboard() {
    val inputMethodManager = context!!.getSystemService(Android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager
    inputMethodManager?.hideSoftInputFromWindow(this.windowToken, 0)
}

そして、これをフラグメントから呼び出します

view.setOnClickListener {
    it.hideKeyboard()
}

または、アクティビティからこのように、contentViewは私のルートビューのIDです

val contentView: View = findViewById(R.id.contentView)
    contentView.setOnClickListener {
    it.hideKeyboard()
}
1

@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (getCurrentFocus() != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } return super.dispatchTouchEvent(ev); }

0
Neeraj

以下のプロセスを使用します。それは私のために完全に働いています。以下の関数をアクティビティクラスに追加します。

  override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
    val v = currentFocus
    if (v is EditText) {
        val outRect = Rect()
        v.getGlobalVisibleRect(outRect)
        if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
            Log.d("focus", "touchevent")
            v.clearFocus()
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
}
return super.dispatchTouchEvent(event)}

以下のコードを使用してフォーカスのステータスを確認できます。アクティビティとフラグメントの両方

appCompatEditText.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus ->
            if (!hasFocus) {
                toast("Focus Off")
            }else {
                toast("Focus On")
            }
        }
0
Shohel Rana