Cómo hacer algo después de que el usuario haga clic en mi EditText

Tengo un EditText que muestra el tiempo. Después de que el usuario hace clic en EditText , quiero mostrar un TimePickerDialog , por lo que configuro View.OnClickListener en mi EditText .

Pero el OnClickListener se comporta de forma extraña: toco EditText y luego aparece el teclado del software (que no quiero). Cuando vuelvo a tocar, finalmente se llama a OnClickListener.onClick() y aparece el cuadro de diálogo.

¿Qué debo hacer si quiero que el diálogo aparezca de inmediato?

A diferencia de la mayoría de los otros controles, EditText s son EditText mientras el sistema está en ‘modo táctil’. El primer evento de clic enfoca el control, mientras que el segundo evento de clic OnClickListener el OnClickListener . Si deshabilita el enfoque de modo táctil con el atributo android:focusableInTouchMode View, OnClickListener debería OnClickListener como se espera.

  

Otra solución es usar el ontouchlistener :

 edittext.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(MotionEvent.ACTION_UP == event.getAction()) { mQuaternion_1.setText("" + mQ1); } return true; // return is important... } }); 

Si devuelve true , se maneja el evento y el teclado no aparecerá. Si desea que el teclado continúe apareciendo y registrando haga clic en, tendrá que devolver false .

Parece que no quiere que el usuario pueda escribir realmente EditText. Solo quiere que puedan elegir un tiempo a través de un selector de tiempo. Entonces, ¿por qué no solo un botón que muestra un TimePickerDialog? Puede mostrar la hora que se seleccionó en un TextView.

O simplemente podría reemplazar la vista EditText con una vista TimePicker (no un diálogo, solo una vista normal).

Lo resolví usando un botón personalizado como este:

  

Si entiendo correctamente, solo necesitas algo como

  

no editable y clicable. Configure OnClickListener y listo. En teoría, en la práctica debes agregar también

 android:editable="false" 

que está en desuso, pero funciona.

En lugar de tocar Listener use Text Change Listener:

 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //yourFunction(); } @Override public void afterTextChanged(Editable s) { } });