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();
}
}
}
fuente
Respuestas:
Solo pon esta línea en tu
onCreate()
Funciona para mí, espero que ayude
fuente
Solicitar enfoque no es suficiente para mostrar el teclado.
Para enfocar y mostrar el teclado, escribirías algo como esto:
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,
Cursor
se 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
EditText
se enfoca. Esto se puede hacer conmyEditText.clearFocus()
. Luego, en su onFocusChangeListener realmente no debería importarle si primeroEditText
tiene foco o no, por lo que onFocusChangeListener podría verse así: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 configuradoonFocusChangeListener
el mismo oyente como lo hice en el ejemplo.fuente
El código Darwind no mostró el teclado.
Esto funciona para mi:
en caso de que el teclado no se muestre, intente forzar:
fuente
Esto cambia el foco de EditText cuando se hace clic en el botón:
fuente
Esto funciona de mi parte:
Esconder:
fuente
Esto es lo que funcionó para mí, establece el foco y muestra el teclado también
fuente
setFocusable
requiere API 26. TampocosetFocusableInTouchMode
fue necesario en mi caso.Si creamos un EditText dinámicamente, entonces tenemos que configurar requestFocus () como se muestra a continuación.
Si ya declaramos el componente en la vista xml, entonces tenemos que encontrarlo y podemos enfocar como se indica a continuación.
Establece solo el foco en el componente EditText correspondiente.
fuente
fuente
fuente
fuente
Podrías hacer esto con una sola línea:
fuente
Para Xamarin.Android he creado esta extensión.
fuente
por favor intente este código en manifiesto
fuente
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 .fuente
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()
osetSelection(0)
(si es emtpy) en tu edittext1?Avíseme si esto ayuda, así que editaré mi respuesta para obtener una solución completa.
fuente
fuente
Si usar
requestFocus()
inonCreate()
introduce el problema de que el teclado no se muestra al tocar, useBindingAdapter
usando un evento SingleLiveEvent y solicite el foco dentro de eso.Aquí se explica cómo hacerlo:
BindingAdapter
fuente
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
fuente