Capturar teclado 'Hecho' para NumberPicker

Tengo un AlertDialog con apenas un poco de texto, un NumberPicker , una AUTORIZACIÓN, y una cancelación.

 package org.dyndns.schep.example; import android.os.Bundler; import android.view.View; import android.widget.NumberPicker; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; public class FooFragment extends DialogFragment { @Override public void onAttach(Activity activity) { super.onAttach(activity); mParent = (MainActivity) activity; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { mParent.setFoo(foo()); } }) .setNegativeButton(android.R.string.cancel, null); View view = getActivity().getLayoutInflater.inflate( R.layout.dialog_foo, null); mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); mPicker.setValue(mParent.getFoo()); builder.setView(view); return builder.create(); } public int foo() { return mPicker.getValue(); } private MainActivity mParent; private NumberPicker mPicker; } 

(Este diálogo todavía no hace las cosas que debe preservar el estado en pausa y reanudar, lo sé.)

Me gustaría que la acción "Hecho" en el teclado virtual u otro IME para descartar el diálogo como si se pulsara "Aceptar", ya que sólo hay un widget para editar.

Parece que la mejor manera de hacer frente a un IME "Hecho" suele ser setOnEditorActionListener en un TextView . Pero no tengo ninguna variable de TextView , y NumberPicker obviamente no TextView ninguna TextView , o callbacks similares del editor. (Quizás NumberPicker contiene un TextView con un ID constante que podría buscar usando findViewById ?)

NumberPicker.setOnValueChangedListener se desencadena en la acción "Hecho", pero también se activa al NumberPicker.setOnValueChangedListener o mover la lista de números, lo que definitivamente no debe descartar el diálogo.

Sobre la base de esta pregunta, traté de comprobar setOnKeyListener , pero que la interfaz no se desencadenó en absoluto cuando se utiliza el teclado suave. No es una sorpresa total, ya que la documentación de KeyEvent sugiere que es más importante para los eventos de hardware, y en las API recientes el teclado KeyEvent no los enviará en absoluto.

¿Cómo puedo conectar el IME "Listo" a la acción "OK" de mi diálogo?

Edit: Desde el aspecto de la fuente, un diseño de NumberPicker contiene un EditText , pero su id es id/numberpicker_input en el paquete com.android.internal . Usar eso no sería fácil, y obviamente está desalentado. Pero parece que sólo puede haber formas de hack para obtener el comportamiento que quiero.

2 Solutions collect form web for “Capturar teclado 'Hecho' para NumberPicker”

¿Cómo puedo conectar el IME "Listo" a la acción "OK" de mi diálogo?

El problema es que no puede pasar los eventos del IME si no tiene un oyente establecido en el widget TextView que actualmente funciona con el IME. Una manera de hacer lo que quieres es conectar nuestra propia lógica con el NumberPicker de NumberPicker que trabaja con el IME (como ya hablaste en la última parte de tu pregunta). Para evitar el uso de ciertos ids u otros trucos de diseño (que pueden ser problemáticos) para obtener un control de ese widget, podría utilizar una táctica codiciosa, la configuración del oyente a cualquier widget de la NumberPicker que podría desencadenar el evento deseado ( TextViews o cualquier subclase De TextView ). Algo como esto:

  private AlertDialog mCurrentDialog; private List<TextView> mTargets = new ArrayList<TextView>(); private OnEditorActionListener mListener = new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { // if a child of NumberPicker triggers the DONE editor event // get a reference to the positive button(which you use in your // code) and click it mCurrentDialog.getButton(Dialog.BUTTON_POSITIVE).performClick(); } return false; } }; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // ... mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1); mPicker.setValue(mParent.getFoo()); // clear any previous targets mTargets.clear(); // find possible targets in the NumberPicker findTextViews(mPicker); // setup those possible targets with our own logic setupEditorListener(); builder.setView(view); // get a reference to the current showed dialog mCurrentDialog = builder.create(); return mCurrentDialog; } 

Donde los métodos son:

 private void findTextViews(ViewGroup parent) { final int count = parent.getChildCount(); for (int i = 0; i < count; i++) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { findTextViews((ViewGroup) child); } else if (child instanceof TextView) { mTargets.add((TextView) child); } } } private void setupEditorListener() { final int count = mTargets.size(); for (int i = 0; i < count; i++) { final TextView target = mTargets.get(i); target.setOnEditorActionListener(mListener); } } 

La otra solución posible (y razonable) (como Naveen ya mencionada en su comentario) es usar uno de los puertos de la clase NumberPicker (o modificar la del SDK) y insertar sus propios identificadores de widget Una referencia al widget una tarea sencilla). Esto sería más fácil de implementar ahora, pero inconveniente para mantener a largo plazo.

Mi búsqueda y experimentación también ha salido con las manos vacías. Dicho esto, yo no animaría este tipo de comportamiento ya que no tiene mucho sentido.

Si necesita un NumberPicker es porque desea que la función de desplazamiento al valor que necesita, no entrar en él (aunque es posible). Si desea introducir el valor que utilizaría un EditText y sería capaz de implementar lo que necesita sin problemas.

Como alternativa, tiene que copiar la implementación de NumberPicker desde el origen y luego cambiarla de acuerdo a sus necesidades (fx mediante la adición de opciones de ime).

  • Cambiar el color de texto de NumberPicker
  • AlertDialog con NumberPicker procesado incorrectamente
  • Implementar OnValueChange a un NumberPicker en Android
  • ¿Cómo saltar un número de selector de números?
  • Cómo aumentar el tamaño de la fuente NumberPicker Android 6.0?
  • Android NumberPicker, DatePicker, flechas TimePicker están desaparecidas
  • Seleccionador de números de Android obtiene valor para textview
  • Bloquear la transición entre el valor mínimo y el valor máximo en NumberPicker
  • NumberPicker no se muestra en AlertDialog
  • Cómo restablecer los datos de NumberPicker
  • Modificación o cambio de valores mínimos, máximos y mostrados para NumberPicker
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.