webentwicklung-frage-antwort-db.com.de

Wie verbirgt man die Tastatur mit einem Fingertipp außerhalb eines Edittextes?

Ich möchte die Tastatur ausblenden, indem ich außerhalb von edittext tippe. Dies ist mein XML-Code:

<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>

Dies ist mein Java-Code (MainActivity):

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

Aber ich muss zweimal tippen, um die Tastatur auszublenden. Beim ersten Tippen wird nur "Weiter" geändert (für den letzten Edittext "Fertig"), um das Symbol einzugeben. Beim zweiten Tippen wird die Tastatur ausgeblendet. Das passiert beim ersten Tippen:

 What the first tap does.

Jetzt habe ich zwei Fragen:

1- Wie kann ich das Problem beheben und die Tastatur mit nur einem Tastendruck ausblenden?

2- Ist es möglich, dies für alle meine Edittext zu tun (ein Code für alle)?

Danke im Voraus.

Versuchen Sie, onClick durch onTouch zu ersetzen. Dazu müssen Sie Ihre Layout-Attribute folgendermaßen ändern:

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

    <RelativeLayout>

        // widgets here

    </RelativeLayout>

</RelativeLayout>

Entfernen Sie dann die rl_main_onClick(View view) {...}-Methode und fügen Sie die onTouch-Listener-Methode in onCreate() ein:

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;
    }
});
9
Marat

@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

Kotlin-Version mit Erweiterung

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

Und nennen Sie es so aus Fragment

view.setOnClickListener {
    it.hideKeyboard()
}

Oder wie folgt aus der Aktivität: contentView ist die ID meiner Stammansicht

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

Ich verwende unter Prozess. Es arbeitet perfekt für mich. Fügen Sie in Ihrer Aktivitätsklasse folgende Funktion hinzu.

  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)}

Sie können den Fokusstatus mithilfe von Below Code überprüfen. Sowohl Aktivität als auch Fragment 

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