webentwicklung-frage-antwort-db.com.de

EditText verliert den Fokus, wenn die Tastatur angezeigt wird. Zum Bearbeiten muss zweimal berührt werden

Ich habe eine Anwendung entworfen, die eine erweiterbare Liste enthält. Am Ende jeder Liste ist ein leerer EditTextbereit, Kommentare zu erhalten. Ich habe folgendes Problem; Wenn ich auf EditTexttippe, ändert sich die Bildschirmgröße geringfügig (kein Problem, da die Größenänderung nicht immer der Fall ist, abhängig von meinem Layout und der Position der EditTextint Liste) und die Soft-Tastatur erscheint. Während dieser Ereignisse verliert der EditTextden Fokus und gewinnt ihn nicht zurück. Dies ist ziemlich unpraktisch, da ohne Fokus trotz Eingabe der Tastatur die Eingabe über die Tastatur nicht EditTexterreicht. Wenn ich es erneut anführe, verhält sich der EditTextwie erwartet.

Es wird noch merkwürdiger. Wenn die Tastatur weiterhin angezeigt wird, kann ich einen anderen EditTextberühren, und dasselbe passiert. es verliert den Fokus. Sobald ich jedoch den anfänglichen Fokusverlust überwunden habe, kann ich mich ohne vorhergehende Probleme zwischen EditTextname__s bewegen. Nur wenn ich die Soft-Tastatur verstecke, verschwindet der "Status" und ich muss zweimal auf EditTextname__s tippen, bevor ich sie bearbeiten kann.

Hier sind Ausschnitte aus meinem Code. Zuerst der empty_comment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

<EditText
    Android:id="@+id/blank_box"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:inputType="textCapSentences"
    Android:imeOptions="actionDone"
    Android:hint="@string/hint"
    Android:layout_marginLeft="30dip" >
</EditText>
</LinearLayout>

Hier ein Auszug aus dem Fragment, in dem ich das fragliche Layout verwende:

convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_empty, null);
final EditText editText = (EditText) convertView.findViewById(R.id.blank_box);
editText.setOnEditorActionListener(new OnEditorActionListener()
{   
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
    {
        if(actionId == EditorInfo.IME_ACTION_DONE)
        {
            // Unrelated code
        }
        return true;
    }
});

Ich gebe keine Eingaben in meiner Manifestdatei an, könnte sie aber angeben, wenn sie hilfreich ist.

Update:

Durch Hinzufügen einer Zeile zu Activityzum Anpassen des Schwenkbereichs Android:windowSoftInputMode="adjustPan" wird das Problem teilweise gelöst. Es ersetzt das aktuelle unerwartete Verhalten durch das Problem, dass EditTextname__-Ansichten möglicherweise durch die Soft-Tastatur ausgeblendet werden.

Bis jetzt wurde keine ideale Lösung gefunden, sondern angesprochen. Schauen Sie sich die Kommentare in der akzeptierten Antwort an, sie könnten sich für Sie als nützlich erweisen!

24
Eric

Sie müssen in Ihrer AndroidManifest.xml ändern

Fügen Sie Android:windowSoftInputMode="adjustPan" in der Aktivität mit der Listenansicht hinzu. Damit lösen Sie Ihr Problem.

<activity Android:name=".MyEditTextInListView"
          Android:label="@string/app_name"
          Android:windowSoftInputMode="adjustPan">
42
jlopez

Eine Lösung besteht darin, ein verzögertes lauffähiges Programm bereitzustellen, das prüft, ob die EditText-Ansicht noch fokussiert ist, und wenn nicht, fokussieren Sie sie.

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(final View v, boolean hasFocus) {
        if (hasFocus) {
            // Request focus in a short time because the
            // keyboard may steal it away.
            v.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (!v.hasFocus()) {
                        v.requestFocus();
                    }
                }
            }, 200);
        }
    }
});
5
Tonic Artos

Ich hatte das gleiche Problem ... Ich habe es gelöst, indem ich EditText erweitert habe.

Ich habe einen onClickListener erstellt und in dieser Methode habe ich folgenden Code erhalten:

public OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        EditTextInput.this.setFocusable(true);
        EditTextInput.this.setFocusableInTouchMode(true);
        EditTextInput.this.requestFocus();
    }
};       

Ich habe dann den folgenden Code in den Callback von onKeyPreIme eingefügt. Sie müssen EditText erweitern, um darauf zugreifen zu können.

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

Ich finde, ich muss die fokussierbare Flagge umschalten, um die Tastatur beim ersten Klick hochzuschalten. Hoffe das hilft ... funktioniert bei mir.

2
Houston

Sie könnten so etwas versuchen:

editText.requestFocus();

Sie können dies auch einstellen:

Android:windowSoftInputMode="stateHidden"

in Ihrer Manifestdatei

1
lokoko

sie können diesen Code mit Android manifest.xml versuchen

fügen Sie den Code zum Android-Manifest hinzu Android: windowSoftInputMode = "adjustPan"

Und auch zum XML-Layout hinzufügen

<EditText  
      Android:background="#FFFFFF"
      Android:capitalize="sentences"
      Android:inputType="textVisiblePassword"
      Android:layout_height="35px"
      >
      <requestFocus /> 

1
saravanan

Zusätzlich zu Android:windowSoftInputMode="adjustPan", versuche es unten:

  1. Einstellen Android:descendantFocusability="afterDescendants" zu Ihrem ListView.
  2. Einstellen Android:focusable="true" und Android:focusableInTouchMode="true" zu Ihrem EditText.
0
Sam Chen

Ich hatte dieses Problem mit Android.support.design.widget.TextInputEditText und es wurde behoben, indem die Flag-Reihenfolge im Manifest geändert wurde:

Android:windowSoftInputMode="stateHidden|adjustPan"

zu 

Android:windowSoftInputMode="adjustPan|stateHidden"
0
Ultimo_m