Establecer foco en EditText

177

Tengo un EditText-Field y configuro un OnFocusChangeListener para ello. Cuando ha perdido el foco, se llama a un método que verifica el valor de EditText con uno en la base de datos. Si el valor de retorno del método es verdadero, se muestra un brindis y el foco debe volver al EditText nuevamente. El foco siempre debe volver al EditText y el teclado debe mostrar, hasta que el valor de retorno del método sea falso.

EDITAR: creo que todavía no he aclarado mi problema real: ningún otro elemento en la pantalla debería poder editarse, hasta que el valor de EditText se edite en un valor, lo que hace que el método "checkLiganame (liganame) " falso retorno. Solo el campo EditText debe ser editable.

Aquí está mi código (que no funciona para mí):

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

y el método:

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

Este código conduce al siguiente resultado: después de que EditText ha perdido el foco, el foco vuelve a EditText, pero ya no puedo editar el texto.

EDIT2: Cambié mi código. Guión:

Hago clic en el primer EditText y pongo una Cadena, que ya está en la base de datos. El brindis está mostrando. Ahora ya no puedo editar mi cadena. Hago clic en "siguiente" en el teclado y el foco permanece en el primer EditText. Intento editar mi cadena, pero no pasa nada. En cambio, mi nueva cadena se muestra en el segundo EditText. Hago clic en la flecha hacia atrás de mi dispositivo y vuelvo a hacer clic en el primer y segundo EditText -> no se muestra ningún teclado.

Aquí está mi nuevo código:

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
fuente
Si le ayudan las siguientes respuestas, acepte una de las respuestas
Akshatha Srinivas el

Respuestas:

277

Solo pon esta línea en tu onCreate()

editText.requestFocus();

Funciona para mí, espero que ayude

ralphgabb
fuente
163

Solicitar enfoque no es suficiente para mostrar el teclado.

Para enfocar y mostrar el teclado, escribirías algo como esto:

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

EDITAR: Agregar información adicional a la respuesta después de agregar el método checkLiganame.

En el método checkLiganame, verifica si el cursor es nulo. El cursor siempre devolverá un objeto, por lo que la comprobación de nulo no hace nada. Sin embargo, el problema está en la línea.db.close();

Cuando cierra la conexión de la base de datos, Cursorse invalida y probablemente se anula.

Por lo tanto, cierre la base de datos después de obtener el valor.

En lugar de verificar que el cursor sea nulo, debe verificar si el número de filas devueltas es mayor que 0: if (cursor.getCount ()> 0) y luego establecer su valor booleano en true si es así.

EDIT2: Entonces, aquí hay un código sobre cómo hacerlo funcionar. EDITAR3: Lo siento código incorrecto que agregué ...; S

En primer lugar, debe despejar el foco si otro EditTextse enfoca. Esto se puede hacer con myEditText.clearFocus(). Luego, en su onFocusChangeListener realmente no debería importarle si primero EditTexttiene foco o no, por lo que onFocusChangeListener podría verse así:

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

Reemplace el primer cheque if(liganame.length() == 0)con su propio cheque, entonces debería funcionar. Tenga en cuenta que todas las vistas de EditText deberían haber configurado onFocusChangeListenerel mismo oyente como lo hice en el ejemplo.

Darwind
fuente
Gracias hasta ahora. Pero esto no resuelve todo mi problema. Edité la descripción de mi problema.
erdalprinz
Entonces, ¿qué está haciendo checkLiganame exactamente? ¿Por qué no puede simplemente verificar si (liganame.isEmpty ()) y si es cierto, requestFocus nuevamente?
Darwind
1
Gracias :-) Ahora mi método funciona correctamente :-) pero mi problema principal con EditText-Field aún no está resuelto. Todavía no puedo editarlo, después de que el método haya encontrado una fila ...
erdalprinz
Entonces agregó if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } ¿Dentro del oyente onFocusChanged?
Darwind
Sí, lo hice. Bajo Liganame.requestFocus () ;. Hago clic en "siguiente" en el teclado, para saltar al siguiente campo Editar texto. Se muestra el brindis y el foco está en AMBOS campos de texto de edición. Pero solo puedo editar el segundo. El primero, que debería ser el único que se centra en este caso, ya no es editable.
erdalprinz
59

El código Darwind no mostró el teclado.

Esto funciona para mi:

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

en caso de que el teclado no se muestre, intente forzar:

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

Esto cambia el foco de EditText cuando se hace clic en el botón:

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
fuente
16

Esto funciona de mi parte:

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

Esconder:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru raj
fuente
1
¿Por qué necesitas esperar 200 ms? ¿es necesario o puedo mostrarlo inmediatamente?
Coder123
11

Esto es lo que funcionó para mí, establece el foco y muestra el teclado también

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
fuente
1
Gracias. setFocusablerequiere API 26. Tampoco setFocusableInTouchModefue necesario en mi caso.
CoolMind
8

Si creamos un EditText dinámicamente, entonces tenemos que configurar requestFocus () como se muestra a continuación.

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

Si ya declaramos el componente en la vista xml, entonces tenemos que encontrarlo y podemos enfocar como se indica a continuación.

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

Establece solo el foco en el componente EditText correspondiente.

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

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
fuente
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();
        }
    });
Príncipe
fuente
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

fuente
2

Podrías hacer esto con una sola línea:

yourEditText.RequestFocusFromTouch();
daniel alexandru Ganea
fuente
En realidad, esta es la única respuesta que me funcionó. Simula el toque tal como quería.
Antonio Vlasic
2

Para Xamarin.Android he creado esta extensión.

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
fuente
2

por favor intente este código en manifiesto

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

Si intenta llamar requestFocus()antes de inflar el diseño, devolverá falso. Este código se ejecuta después de que el diseño se infla. No necesita 200 ms de retraso como se mencionó anteriormente .

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
fuente
1

No sé si ya encontraste una solución, pero para tu problema de edición después de solicitar enfoque nuevamente:

¿Has intentado llamar al método selectAll()o setSelection(0)(si es emtpy) en tu edittext1?

Avíseme si esto ayuda, así que editaré mi respuesta para obtener una solución completa.

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

Si usar requestFocus()in onCreate()introduce el problema de que el teclado no se muestra al tocar, use BindingAdapterusando un evento SingleLiveEvent y solicite el foco dentro de eso.

Aquí se explica cómo hacerlo:

BindingAdapter

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

Mi respuesta aqui

Como leí en el documento oficial, creo que esta es la mejor respuesta, simplemente pase la vista a parámetros como su EditText, pero showSoftKeyboard parece no funcionar en horizontal

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ỏ
fuente