type textcapsentences studio setoneditoractionlistener setinputtype plain imeactionid example edittext android imeoptions

android - textcapsentences - setoneditoractionlistener



Android imeOptions="actionDone" no funciona (7)

Debe configurar OnEditorActionListener para que EditText implemente la acción que desea realizar cuando el usuario haga clic en "Listo" en el teclado.

Estoy intentando obtener una pantalla de inicio de sesión para una aplicación de Android y hasta ahora este es mi código:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="vertical"> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Username" android:inputType="text" android:singleLine="true" android:imeOptions="actionNext"> <requestFocus /> </EditText> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Password" android:inputType="textPassword" android:singleLine="true" android:imeOptions="actionDone" /> <Button android:id="@+id/buttonLaunchTriage" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:text="@string/login" /> </LinearLayout> </RelativeLayout>

Cuando intento ejecutarlo, el teclado muestra las teclas correctas, pero cuando intento presionar Terminar después de ingresar la contraseña, no sucede nada. Estoy usando esto para manejar el botón presionando:

private void setupLoginButton() { Button launchButton = (Button) findViewById(R.id.buttonLaunchTriage); launchButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText username = (EditText) findViewById(R.id.patient_start_userName_value); EditText password = (EditText) findViewById(R.id.patient_start_password_value); try { if(TriageApplicationMain.validateUser(username.getText().toString(),password.getText().toString(),getApplicationContext())) { Toast.makeText(StartActivity.this, "Launching Triage Application", Toast.LENGTH_SHORT) .show(); startActivity(new Intent(StartActivity.this, MainActivity.class)); } else { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( StartActivity.this); // set dialog message alertDialogBuilder .setMessage("Incorrect Credentials") .setCancelable(false) .setPositiveButton("OK",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) { // if this button is clicked, close // current activity dialog.cancel(); } }); // create alert dialog AlertDialog alertDialog = alertDialogBuilder.create(); // show it alertDialog.show(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); }

Sé que esto es un montón de código, pero si alguien pudiera ayudarme aquí sería genial. Esto es para un proyecto escolar.

PD: He buscado en Google una hora sólida antes de publicar esto, así que no critique por no hacerlo. Si encuentra un enlace que sea útil, por favor comparta.


Debe configurar OnEditorActionListener para que EditText implemente la acción que desea realizar cuando el usuario haga clic en "Listo" en el teclado.

Por lo tanto, necesitas escribir algún código como:

password.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { // Do whatever you want here return true; } return false; } });

Ver el tutorial en el sitio de desarrolladores de Android


Después de probar muchas cosas, esto es lo que funcionó para mí:

android:maxLines="1" android:inputType="text" android:imeOptions="actionDone"


Qianqian es correcto. Su código solo escucha el evento de clic de botón, no el evento EditorAction.

Quiero agregar que algunos proveedores de teléfonos pueden no implementar correctamente la acción DONE. He probado esto con un Lenovo A889, por ejemplo, y ese teléfono nunca envía EditorInfo.IME_ACTION_DONE cuando presionas EditorInfo.IME_ACTION_DONE , siempre envía EditorInfo.IME_ACTION_UNSPECIFIED así que en realidad termino con algo como

myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() { @Override public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) { boolean handled=false; // Some phones disregard the IME setting option in the xml, instead // they send IME_ACTION_UNSPECIFIED so we need to catch that if(EditorInfo.IME_ACTION_DONE==actionId || EditorInfo.IME_ACTION_UNSPECIFIED==actionId) { // do things here handled=true; } return handled; } });

También note la bandera "manejada" (Qianqian no explicó esa parte). Puede ser que otros OnEditorActionListeners más arriba estén escuchando eventos de un tipo diferente. Si su método devuelve falso, eso significa que no manejó este evento y se pasará a otros. Si devuelve verdadero, significa que lo manejó / consumió y no se transmitirá a otros.


Simplemente agregue android:inputType="..." a su EditText. ¡¡Funcionará!! :)


Solo agrega esto a tus atributos:

android:inputType="textPassword"

Doc: here


Use android:inputType="Yours" luego

android:lines="1" android:imeOptions="actionDone"