Setzen Sie den Fokus auf EditText

176

Ich habe ein EditText-Feld und setze einen OnFocusChangeListener dafür. Wenn der Fokus verloren gegangen ist, wird eine Methode aufgerufen, die den Wert des EditText mit einem in der Datenbank überprüft. Wenn der Rückgabewert der Methode wahr ist, wird ein Toast angezeigt und der Fokus sollte wieder auf den EditText gerichtet sein. Der Fokus sollte immer wieder auf den EditText gerichtet sein und die Tastatur sollte angezeigt werden, bis der Rückgabewert der Methode falsch ist.

BEARBEITEN: Ich denke, ich habe mein eigentliches Problem noch nicht klargestellt: Kein anderes Element auf dem Bildschirm sollte bearbeitet werden können, bis der Wert des EditText zu einem Wert bearbeitet wird, wodurch die Methode "checkLiganame (liganame)" erstellt wird. " falsch zurückgeben. Nur das EditText-Feld sollte bearbeitet werden können.

Hier ist mein Code (der bei mir nicht funktioniert):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

und die Methode:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

Dieser Code führt zu folgendem Ergebnis: Nachdem der EditText den Fokus verloren hat, springt der Fokus zurück zu EditText, aber ich kann den Text nicht mehr bearbeiten.

EDIT2: Mein Code wurde geändert. Szenario:

Ich klicke auf den ersten EditText und füge einen String ein, der sich bereits in der Datenbank befindet. Der Toast zeigt. Jetzt kann ich meinen String nicht mehr bearbeiten. Ich klicke auf der Tastatur auf "Weiter" und der Fokus bleibt auf dem ersten EditText. Ich versuche meinen String zu bearbeiten, aber es passiert nichts. Stattdessen wird mein neuer String im zweiten EditText angezeigt. Ich klicke auf den Zurückpfeil meines Geräts und klicke erneut auf den ersten und zweiten EditText -> keine Tastatur wird angezeigt.

Hier ist mein neuer Code:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}
erdalprinz
quelle
Wenn Ihnen die folgenden Antworten geholfen werden, akzeptieren Sie bitte eine der Antworten
Akshatha Srinivas

Antworten:

275

Setzen Sie einfach diese Zeile auf Ihre onCreate()

editText.requestFocus();

Es funktioniert bei mir, hoffe es hilft

ralphgabb
quelle
163

Das Anfordern des Fokus reicht nicht aus, um die Tastatur anzuzeigen.

Um den Fokus zu erhalten und die Tastatur zu zeigen, würden Sie ungefähr Folgendes schreiben:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

BEARBEITEN: Hinzufügen zusätzlicher Informationen zur Antwort, nachdem die checkLiganame-Methode hinzugefügt wurde.

In der checkLiganame-Methode prüfen Sie, ob der Cursor null ist. Der Cursor gibt immer ein Objekt zurück, sodass die Prüfung auf Null nichts bewirkt. Das Problem liegt jedoch in der Leitungdb.close();

Wenn Sie die Datenbankverbindung schließen, Cursorwird die ungültig und höchstwahrscheinlich null.

Schließen Sie also die Datenbank, nachdem Sie den Wert abgerufen haben.

Anstatt den Cursor auf Null zu überprüfen, sollten Sie überprüfen, ob die Anzahl der zurückgegebenen Zeilen mehr als 0 beträgt: if (cursor.getCount ()> 0) und dann Ihren Booleschen Wert auf true setzen, wenn dies der Fall ist.

EDIT2: Hier ist ein Code, wie es funktioniert. EDIT3: Entschuldigung, falscher Code, den ich hinzugefügt habe ...; S.

Zunächst müssen Sie den Fokus löschen, wenn ein anderer den EditTextFokus erhält. Dies kann mit gemacht werden myEditText.clearFocus(). Dann sollte es Ihnen in Ihrem onFocusChangeListener eigentlich egal sein, ob Sie zuerst EditTextden Fokus haben oder nicht, sodass der onFocusChangeListener ungefähr so ​​aussehen könnte:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

Ersetzen Sie den ersten Scheck if(liganame.length() == 0)durch Ihren eigenen Scheck, dann sollte es funktionieren. Beachten Sie, dass alle EditText-Ansichten onFocusChangeListenerauf denselben Listener eingestellt sein sollten, wie ich es im Beispiel getan habe.

Darwind
quelle
Vielen Dank so weit. Aber das löst nicht mein ganzes Problem. Ich habe die Beschreibung meines Problems bearbeitet.
erdalprinz
Was macht checkLiganame genau? Warum können Sie nicht einfach überprüfen, ob (liganame.isEmpty ()) und wenn es wahr ist, requestFocus erneut anfordern?
Darwind
1
Danke :-) Jetzt funktioniert meine Methode richtig :-) aber mein Hauptproblem mit dem EditText-Feld ist noch nicht gelöst. Ich kann es immer noch nicht bearbeiten, nachdem die Methode eine Zeile gefunden hat ...
erdalprinz
Sie haben also hinzugefügt, ob (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Im onFocusChanged-Listener?
Darwind
Ja, habe ich. Unter Liganame.requestFocus ();. Ich klicke auf der Tastatur auf "Weiter", um in das nächste EditText-Feld zu springen. Der Toast wird angezeigt und der Fokus liegt auf BEIDEN EditText-Feldern. Aber ich kann nur den zweiten bearbeiten. Der erste, der in diesem Fall der einzige sein sollte, der den Fokus hat, kann nicht mehr bearbeitet werden.
erdalprinz
59

Darwind-Code zeigte die Tastatur nicht an.

Das funktioniert bei mir:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

Falls die Tastatur nicht angezeigt wird, versuchen Sie Folgendes zu erzwingen:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Groco
quelle
19

Dies ändert den Fokus des EditText, wenn auf die Schaltfläche geklickt wird:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}
Simon Chius
quelle
16

Das funktioniert bei mir:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Verstecken:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru Raj
quelle
1
Warum müssen Sie 200 ms warten? ist es notwendig oder kann ich es einfach sofort zeigen?
Coder123
11

Das hat bei mir funktioniert, setzt den Fokus und zeigt auch die Tastatur

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Berni Gf
quelle
1
Vielen Dank. setFocusableerfordert API 26. Auch setFocusableInTouchModewurde in meinem Fall nicht benötigt.
CoolMind
8

Wenn wir einen EditText dynamisch erstellen, müssen wir den requestFocus () wie unten angegeben festlegen.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Wenn wir die Komponente bereits in der XML-Ansicht deklariert haben, müssen wir sie finden und können den Fokus wie unten angegeben festlegen.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Es wird nur der Fokus auf die entsprechende EditText-Komponente gesetzt.

Sudhakar
quelle
6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
quelle
4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });
Prinz
quelle
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

quelle
2

Sie können dies mit einer einzigen Zeile tun:

yourEditText.RequestFocusFromTouch();
Daniel Alexandru Ganea
quelle
Eigentlich ist dies die einzige Antwort, die für mich funktioniert hat. Es simuliert die Berührung genau so, wie ich es wollte.
Antonio Vlasic
2

Für Xamarin.Android habe ich diese Erweiterung erstellt.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}
c.lamont.dev
quelle
2

Bitte versuchen Sie diesen Code auf Manifest

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>
Felix Cruz
quelle
2

Wenn Sie versuchen aufzurufen, requestFocus()bevor das Layout aufgeblasen ist, wird false zurückgegeben. Dieser Code wird ausgeführt, nachdem das Layout aufgeblasen wurde. Sie benötigen keine Verzögerung von 200 ms, wie oben erwähnt .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Mücahit Şenol
quelle
1

Ich weiß nicht, ob Sie bereits eine Lösung gefunden haben, aber für Ihr Bearbeitungsproblem, nachdem Sie erneut den Fokus angefordert haben:

Haben Sie versucht, die Methode selectAll()oder setSelection(0)(falls emtpy) auf Ihrem edittext1 aufzurufen?

Bitte lassen Sie mich wissen, ob dies hilft, damit ich meine Antwort zu einer vollständigen Lösung bearbeiten kann.

Unbestritten
quelle
1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 
user5176384
quelle
0

Bei der Verwendung requestFocus()in einer onCreate()Einführung in der Frage der Tastatur zeigt , das nicht vom Fass, verwenden Sie BindingAdaptermit einem SingleLiveEvent und fordern Sie den Fokus im Innern , dass.

So geht's:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}
Yogesh Umesh Vaity
quelle
0

Meine Antwort hier

Während ich das offizielle Dokument lese, denke ich, dass dies die beste Antwort ist. Übergeben Sie die Ansicht einfach an Parameter wie Ihren EditText, aber showSoftKeyboard scheint nicht im Querformat zu funktionieren

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
Thành Thỏ
quelle