it-swarm.com.de

Setzen Sie den Fokus auf EditText

Ich habe ein EditText-Feld und setze einen OnFocusChangeListener dafür. Wenn es den Fokus verloren hat, wird eine Methode aufgerufen, die den Wert des EditText mit einem Wert in der Datenbank überprüft. Wenn der Rückgabewert der Methode true ist, wird ein Toast angezeigt und der Fokus sollte wieder in den EditText zurückkehren. Der Fokus sollte immer wieder im EditText angezeigt werden und die Tastatur sollte angezeigt werden, bis der Rückgabewert der Methode false ist.

BEARBEITEN: Ich denke, ich habe mein eigentliches Problem noch nicht vollständig geklärt: Kein anderes Element auf dem Bildschirm sollte bearbeitet werden können, bis der Wert des EditText in einen Wert umgewandelt wird, der die Methode "checkLiganame (liganame)" ausmacht. " falsch zurückgeben. Nur das EditText-Feld sollte editierbar sein.

hier ist mein code (was für mich 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 dem folgenden Ergebnis: Nachdem der EditText den Fokus verloren hat, springt der Fokus zurück zu EditText, aber ich kann den Text nicht mehr bearbeiten.

EDIT2: Code 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 sich. Jetzt kann ich meinen String nicht mehr bearbeiten. Ich klicke auf "Weiter" auf der Tastatur 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 Rückwärtspfeil meines Geräts und klicke erneut auf den ersten und zweiten EditText -> es wird keine Tastatur 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();
        }
    }
}
135
erdalprinz

Setzen Sie diese Zeile einfach auf Ihre onCreate() 

editText.requestFocus();

Es funktioniert für mich, hoffe es hilft

210
ralphgabb

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

Um den Fokus zu erhalten und die Tastatur zu zeigen, würden Sie so etwas schreiben:

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

BEARBEITEN: Hinzufügen zusätzlicher Informationen zur Antwort, nachdem die Methode checkLiganame 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 Zeile db.close();

Wenn Sie die Datenbankverbindung schließen, wird Cursor ungültig und höchstwahrscheinlich auf Null gesetzt.

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

Anstatt den Cursor auf Null zu prüfen, sollten Sie prüfen, ob die Anzahl der zurückgegebenen Zeilen mehr als 0 ist: if (Cursor.getCount ()> 0). Setzen Sie dann Ihren Boolean-Wert auf "true".

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

Zunächst einmal müssen Sie den Fokus löschen, wenn ein anderes EditText den Fokus erhält. Dies kann mit myEditText.clearFocus() erfolgen. In Ihrem onFocusChangeListener sollten Sie sich nicht wirklich darum kümmern, ob EditText zuerst den Fokus hat oder nicht, sodass der onFocusChangeListener in etwa 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 Check if(liganame.length() == 0) durch Ihren eigenen Check. Dann sollte es funktionieren. Beachten Sie, dass alle EditText-Ansichten ihren onFocusChangeListener auf denselben Listener festgelegt haben sollten, wie ich es im Beispiel getan habe.

142
Darwind

Darwind-Code zeigte die Tastatur nicht an.

Das funktioniert für mich:

        _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);
48
Groco

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();
            }
        });
    }
}
19
Simon Chius

Wenn wir einen EditText dynamisch erstellen, müssen wir requestFocus () wie folgt einstellen.

    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 wir können den Fokus wie folgt angeben.

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

Es legt nur den Fokus auf die entsprechende EditText-Komponente fest.

8
Sudhakar

Das funktioniert von 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);
}
8
Guru raj
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
6
Barakzai

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);
5
Berni Gf
    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();
        }
    });
4
D Prince
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);
3
user6602265

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);
        }
    }
}
1
c.lamont.dev

bitte versuche diesen Code auf Manifest

<activity Android:name=".EditTextActivity" Android:windowSoftInputMode="stateAlwaysVisible">
</activity>
1
TheLastSummer
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 
1
user5176384

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

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

Bitte lassen Sie mich wissen, wenn dies hilfreich ist, und ich werde meine Antwort zu einer vollständigen Lösung bearbeiten.

1
Undisputed

Sie können dies mit einer einzigen Zeile tun:

yourEditText.RequestFocusFromTouch();

Sie können diesen Code verwenden

txt_Mob.setOnFocusChangeListener(new View.OnFocusChangeListener(){

    @Override
    public void onFocusChange(View view, boolean b) {

        if (b){
          //IsFocus

        }else{
          //IsNotFocus

        }

    }
});
0
Diako Hasani