Imposta Focus su EditText


178

Ho un campo EditText e ho impostato un OnFocusChangeListener per questo. Quando ha perso il focus, viene chiamato un metodo che controlla il valore di EditText con uno nel database. Se il valore restituito del metodo è true, viene visualizzato un brindisi e lo stato attivo dovrebbe tornare nuovamente sul EditText. Il focus dovrebbe sempre tornare su EditText e la tastiera dovrebbe mostrare, fino a quando il valore di ritorno del metodo è falso.

EDIT: penso, non ho ancora chiarito perfettamente il mio vero problema: nessun altro elemento sullo schermo dovrebbe essere in grado di modificare, fino a quando il valore di EditText non viene modificato in un valore, il che rende il metodo "checkLiganame (liganame) "restituisci falso. Solo il campo EditText dovrebbe essere modificabile.

ecco il mio codice (che non funziona per me):

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

e il metodo:

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

Questo codice porta al seguente risultato: Dopo che EditText ha perso il focus, il focus torna a EditText, ma non riesco più a modificare il testo.

EDIT2: modificato il mio codice. Scenario:

Faccio clic sul primo EditText e inserisco una stringa, che è già nel database. Il brindisi sta mostrando. Ora non posso più modificare la mia stringa. Faccio clic su "Avanti" sulla tastiera e lo stato attivo rimane sul primo EditText. Provo a modificare la mia stringa, ma non succede nulla. Invece la mia nuova stringa viene mostrata nel secondo EditText. Faccio clic sulla freccia indietro del mio dispositivo e faccio clic sul primo e sul secondo EditText -> nessuna tastiera viene visualizzata.

Ecco il mio nuovo codice:

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

Se le risposte di seguito ti sono state di aiuto, ti preghiamo di accettare una delle risposte
Akshatha Srinivas

Risposte:


278

Metti questa linea sul tuo onCreate()

editText.requestFocus();

Funziona per me, spero che aiuti


163

Richiedere lo stato attivo non è sufficiente per mostrare la tastiera.

Per ottenere lo stato attivo e mostrare la tastiera, dovresti scrivere qualcosa del genere:

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

MODIFICA: aggiunta di informazioni extra alla risposta dopo l'aggiunta del metodo checkLiganame.

Nel metodo checkLiganame si controlla se il cursore è nullo. Il cursore restituirà sempre un oggetto, quindi il controllo per null non fa nulla. Tuttavia, il problema è nella lineadb.close();

Quando si chiude la connessione al database, Cursordiventa non valido e molto probabilmente viene annullato.

Quindi chiudi il database dopo aver recuperato il valore.

Invece di controllare il cursore per null, è necessario verificare se il numero di righe restituite è maggiore di 0: if (cursor.getCount ()> 0) e quindi impostare il valore booleano su true in tal caso.

EDIT2: Quindi ecco un po 'di codice su come farlo funzionare. EDIT3: scusa codice errato che ho aggiunto ...; S

Prima di tutto, è necessario deselezionare la messa a fuoco se un'altra EditTextviene messa a fuoco. Questo può essere fatto con myEditText.clearFocus(). Quindi nel tuo onFocusChangeListener non dovresti davvero preoccuparti se prima EditTextha il focus o no, quindi il onFocusChangeListener potrebbe assomigliare a questo:

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

Sostituisci il primo controllo if(liganame.length() == 0)con il tuo controllo, quindi dovrebbe funzionare. Si noti che tutte le visualizzazioni EditText avrebbero dovuto impostarle onFocusChangeListenersullo stesso listener come ho fatto nell'esempio.


Grazie finora. Ma questo non risolve il mio intero problema. Ho modificato la descrizione del mio problema.
Erdalprinz,

Cosa sta facendo esattamente checkLiganame? Perché non riesci a controllare se (liganame.isEmpty ()) e se è vero, requestFocus di nuovo?
Darwind,

1
Grazie :-) Ora il mio metodo funziona correttamente :-) ma il mio problema principale con EditText-Field non è stato ancora risolto. Non riesco ancora a modificarlo, dopo che il metodo ha trovato una riga ...
Erdalprinz,

Quindi hai aggiunto if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } All'interno del listener onFocusChanged?
Darwind,

Si l'ho fatto. Sotto Liganame.requestFocus () ;. Faccio clic su "Avanti" sulla tastiera per passare al campo Modifica testo successivo. Il brindisi viene mostrato e l'attenzione è focalizzata su ENTRAMBE EditText-Fields. Ma posso solo modificare il secondo. Il primo, che dovrebbe essere l'unico a essere focalizzato in questo caso, non è più modificabile.
Erdalprinz,

59

Il codice Darwind non mostrava la tastiera.

Questo funziona per me:

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

se la tastiera non viene visualizzata, provare a forzare:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

Ciò cambia il focus di EditText quando si fa clic sul pulsante:

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

16

Questo funziona da me:

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

Nascondere:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
Perché è necessario attendere 200 ms? è necessario o posso semplicemente mostrarlo immediatamente?
Coder123

11

Questo è ciò che ha funzionato per me, mette a fuoco e mostra anche la tastiera

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

1
Grazie. setFocusablerichiede API 26. Inoltre, setFocusableInTouchModenel mio caso non era necessario.
CoolMind

8

Se creiamo un EditText in modo dinamico, dobbiamo impostare requestFocus () come indicato di seguito.

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

Se abbiamo già dichiarato il componente nella vista XML, allora dobbiamo trovarlo e possiamo focalizzare come indicato di seguito.

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

Imposta solo lo stato attivo sul componente EditText corrispondente.


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

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

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

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

//Function Call
requestFocus(yourEditetxt);


2

Per Xamarin.Android ho creato questa estensione.

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

2

prova questo codice su manifest

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

2

Se si tenta di chiamare requestFocus()prima che il layout sia gonfiato, verrà restituito false. Questo codice viene eseguito dopo che il layout viene gonfiato. Non è necessario un ritardo di 200 ms come indicato sopra .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

Non so se hai già trovato una soluzione, ma per il tuo problema di modifica dopo aver richiesto nuovamente lo stato attivo:

Hai provato a chiamare il metodo selectAll()o setSelection(0)(se è emtpy) sul tuo edittext1?

Per favore fatemi sapere se questo aiuta, quindi modificherò la mia risposta a una soluzione completa.


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

0

Se l'utilizzo requestFocus()in onCreate()introduce il problema della tastiera che non viene visualizzata al tocco, utilizzare BindingAdapterutilizzando un SingleLiveEvent e richiedere lo stato attivo al suo interno.

Ecco come farlo:

BindingAdapter

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

0

La mia risposta qui

Mentre leggo il documento ufficiale, penso che questa sia la risposta migliore, basta passare la vista a parametri come il tuo EditText, ma showSoftKeyboard sembra non funzionare in orizzontale

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)
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.