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回目のタップでキーボードを非表示にします。これは最初のタップで何が起こるかです:
今私は2つの質問があります:
ワンタップで修正してキーボードを非表示にするにはどうすればよいですか?
すべてのedittext(すべてに対して1つのコード)に対してそれを行うことは可能ですか?
onClick
をonTouch
に置き換えてみてください。そのためには、次のようにレイアウト属性を変更する必要があります。
_<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;
}
});
_
拡張子付きの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()
}
@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); }
以下のプロセスを使用します。それは私のために完全に働いています。以下の関数をアクティビティクラスに追加します。
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")
}
}