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

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


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.


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

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

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

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

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.


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

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

2

por favor intente este código en manifiesto

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

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

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.


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

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

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)
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.