Android: Fehler Popup auf EditText nicht nach unten verschieben, wenn Tastatur geht weg

Ich habe eine Aktivität, die ein paar EditTexts auf dem Bildschirm für die Benutzereingabe zeigt. Um sicher zu sein, dass die Softtastatur meine Felder nicht deckt, wenn es angezeigt wird, habe ich die Eigenschaft gesetzt

android:windowSoftInputMode="adjustPan" 

Für meine Tätigkeit im Manifest. Ich bestätige den EditText-Inhalt, wenn 1. Die Ansicht verliert Fokus 2. Wenn der Benutzer die 'Enter'-Aktion ausführt. Bei der Validierung, wenn der Wert nicht gültig ist, rufe ich an

  • Berechnen Sie Abstand zwischen Bluetooth-Gerät in Android
  • Wie ändere ich EditText Inhalt mit Javascript?
  • Android Studio 3.0 Vorschau Fehlende Importe beim Refactoring Kotlin Code
  • Facebook Fehler im Zusammenhang mit auth.extendSSOAccessToken
  • Sip Fehler bei der Registrierung
  • Warum funktioniert das CSS nicht für Chrome auf Android, sondern funktioniert überall?
  •  setError(CharSequence error) 

    Auf dem EditText, was dazu führt, dass ein Popup angezeigt wird, das den Fehler enthält, den ich bestanden habe. Das Problem ist, wenn das EditText verschoben wird, wenn die Softtastatur angezeigt wird und das Popup zu diesem Zeitpunkt angezeigt wird (Validierung ist fehlgeschlagen), das Popup doesn ' T folge dem EditText nach unten, wenn die Tastatur weggeht, es bleibt dort, wo es zuerst angezeigt wurde.

    Irgendwelche Ideen, wie man das beheben kann? Ist das ein Fehler in Android?

  • Genymotion Plugin kann nicht in Eclipse angezeigt werden
  • Beschränken Sie API-Anfragen nur auf meine eigene mobile App
  • Stellen Sie die Starthöhe von CollapsingToolbarLayout ein
  • Android: Wie bekomme ich die Kontakt-ID per Telefonnummer?
  • NestedScrollView scroll mit recyclerview
  • Adb emu Befehl funktioniert nicht manchmal
  • 5 Solutions collect form web for “Android: Fehler Popup auf EditText nicht nach unten verschieben, wenn Tastatur geht weg”

    Wenn das so ist, wie du beschrieben hast, denke ich, dass dies ein echter Bug sein kann, also lohnt es sich, es auf der Android Source Website zu schreiben.

    So offensichtlich kann ich nur an hack work arounds denken!

    Überschreiben, wenn die Tastatur verschwindet :

     public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { revalidateEditText(); return false; } return super.dispatchKeyEvent(event); } public void revalidateEditText(){ // Dismiss your origial error dialog setError(null); // figure out which EditText it is, you already have this code // call your validator like in the Q validate(editText); // or whatever your equivalent is } 

    Dies wird Ihr EditText neu beurteilen, den Fehlerdialog entlassen und erneut anzeigen.

    Wie ist das?

    Inspiriert von: Rückmeldung bei EditText

    Sie können auch Ihre benutzerdefinierte EditText und Override-Methode aufKeyPreIme (int keyCode, KeyEvent-Ereignis)

     @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { clearFocus(); return false; } } 

    Für mich hat es geholfen, das Layout in einem ScrollView . Danach hat das ganze scrollen der setError-box gut funktioniert.

    Haben Sie versucht, Ihre Ansicht zu bestätigen, dh rufen Sie die ungültige () Methode Ihrer Ansicht auf.

    Try editText.invalidate();

    Vielen Dank.

    Ich fand die LÖSUNG!

    Hier ist der Code:

     import android.content.Context; import android.os.Handler; import android.support.v7.widget.AppCompatEditText; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; /** * Created by Jaume Colom Ferrer on 14/12/2015 */ public class EditTextPopUpFixed extends AppCompatEditText { private static final int TIME_SLEEP = 500; private Context ctx; private EditTextListener mListener; private int backTimes = 0; public EditTextPopUpFixed(Context context) { super(context); ctx = context; } public EditTextPopUpFixed(Context context, AttributeSet attrs) { super(context, attrs); ctx = context; } public EditTextPopUpFixed(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); ctx = context; } public void setEditTextListener(EditTextListener lis) { mListener = lis; this.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { backTimes = 0; return false; } }); } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) backTimes++; if (backTimes == 3) { backTimes = 0; mListener.close(); return true; } if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ENTER) { InputMethodManager mgr = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); if (mgr.isActive()) { mgr.hideSoftInputFromWindow(this.getWindowToken(), 0); boolean mustRevalidate = getError() != null; setError(null); if (mListener != null && mustRevalidate) { Handler han = new Handler(); han.postDelayed(new Runnable() { @Override public void run() { mListener.revalidateEditText(); } }, TIME_SLEEP); } } else { backTimes = 0; super.onKeyPreIme(keyCode, event); } return true; } return false; } public interface EditTextListener { void revalidateEditText(); //Revalidates the EditText to refresh the Popup (Must revalidate the EditText in its implementation) void close(); // Method to close the activity or fragment (Must finish activity or go back in its implementation) } } 

    Sie können diesen benutzerdefinierten EditText verwenden, um diesen Fehler zu lösen. Es erfrischt den Fehler, nach der Tastatur öffnen / schließen, und dein Popup wird immer korrekt angezeigt.

    Sie müssen enge (beenden oder onBackPressed) implementieren und edittext Methoden in Ihrer Klasse neu bewerten.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.