studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android onclick android-edittext ontouchevent

programacion - manual android studio avanzado



En EditText, aparece un cuadro de diálogo al hacer clic en un subconjunto específico de texto (5)

Puede ser que esto pueda funcionar

EditText e = new EditText(context); e.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { // TODO Auto-generated method stub if(hasFocus) { //dialogue popup } } });

o puede usar e.hasFocus(); y luego use e.setFocusable(false); para hacer que se desenfoque

/////////////// mi código

e.setInputType(InputType.TYPE_NULL); e.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder sa = new Builder(ctx); sa.create().setOnDismissListener(new OnDismissListener() { public void onDismiss(DialogInterface dialog) { // TODO Auto-generated method stub e.setInputType(InputType.TYPE_CLASS_TEXT); } }); sa.show(); } });

Encontré dos soluciones - vea la respuesta seleccionada

Cuando el usuario hace clic en una región determinada de EditText, quiero abrir un cuadro de diálogo. Usé onClick para capturar el clic. Esto funciona parcialmente: la primera vez que el usuario toca EditText, el teclado virtual aparece y el diálogo no. Los toques posteriores muestran el teclado y luego el diálogo (y el teclado desaparece).

Sospecho que esto tiene algo que ver con que EditText gane atención.

Aquí hay un fragmento de código:

public class PrefixEditText extends EditText implements TextWatcher, OnClickListener { public PrefixEditText (Context context) { super (context); setOnClickListener (this); } @Override public void onClick(View v) { int selStart = getSelectionStart(); if (selStart < some_particular_pos) bring_up_dialog(); } }

IMPORTANTE: no quiero deshabilitar completamente el comportamiento normal de EditText. Quiero que el usuario pueda hacer selecciones de región (para copiar y pegar). Probablemente aún quiero que se enfoque (así que no rompo el modelo cuando las personas con teclados físicos usan la aplicación). Y está bien para el clic para establecer la posición del cursor. Por lo tanto, las soluciones que anulan Toque y bloquean todas las acciones onTouch desde EditText no funcionarán para mí.

ACTUALIZAR He descubierto un poco más. Si EditText se está enfocando, se llama aFocusChange y no a onClick. Si ya tiene foco, se llama a OnClick y no a onFocusChange.

En segundo lugar, es posible ocultar el teclado llamando

setInputType (InputType.TYPE_NULL);

Al hacerlo en las tareas de Focus Change, el teclado nunca aparece. Hacerlo en onClick (asumiendo que el teclado estaba oculto antes del clic) aparentemente es demasiado tarde - el teclado aparece y luego desaparece.

La siguiente idea para intentar sería ocultar el teclado durante onTouch. Sin embargo, me temo que debo meterme con ese código, parece que lo que descubra sería muy frágil con respecto a las versiones futuras de EditText.

¿Alguna idea sobre esto?


intente cambiar la captura, haga clic en on, haga clic en onTouch

this.editText.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //dialogue popup } return false; } });


intente esto si puede ayudarlo por primera vez a que el texto de edición se comporte como una edición de texto normal y con la condición de que pueda mostrar el diálogo según sea necesario

EditText editText; mTim_edittext.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ //statement if(condition){ AlertDialog diaBox = Utils.showErrorDialogBox( "Term in Months Cannot be 0", context); diaBox.show(); } } } });


¡Después de muchos experimentos, aquí hay dos soluciones de trabajo! Los probé en mis dos dispositivos: Nexus 7 ejecutando 4.2.1, Kyocera C5170 runing 4.0.4. Mi preferencia es la Solución 2.

SOLUCIÓN 1

Para la primera, el truco fue determinar la posición del cursor en onTouch en lugar de onClick, antes de que EditText tenga la oportunidad de hacerlo funcionar, especialmente antes de que aparezca el teclado.

Un comentario adicional: asegúrese de configurar android: windowSoftInputMode = "stateHidden" en su manifiesto para la ventana emergente, o obtendrá el teclado junto con la ventana emergente.

Aquí está el código completo:

public class ClickText extends EditText implements OnTouchListener { public ClickText (Context context, AttributeSet attrs) { super (context, attrs); setOnTouchListener (this); } @Override public boolean onTouch (View v, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { int line = getLayout().getLineForVertical ((int)event.getY()); int onTouchCursorPos = getLayout().getOffsetForHorizontal (line, event.getX()); if (onTouchCursorPos < 10) // or whatever condition showPopup (this); // or whatever you want to do } return false; } private void showPopup (final EditText text) { Intent intent = new Intent (getContext(), Popup.class); ((Activity)getContext()).startActivity (intent); } }

SOLUCIÓN 2

Este es realmente más simple y, creo, es mejor, menos efectos secundarios.

Aquí, el truco es dejar que EditText haga todo su procesamiento de clics y luego anularlo de forma asincrónica. La esencia es: aguarde el toque para "dejarlo ir" - MotionEvent.ACTION_UP - y luego, en lugar de hacer su acción en ese momento, publique un Runnable en la cola del evento y realice su acción allí.

Todo el código

public class ClickText extends EditText implements OnTouchListener { public ClickText (Context context, AttributeSet attrs) { super (context, attrs); setOnTouchListener (this); } @Override public boolean onTouch (View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_UP: { post (new Runnable () { // Do this asynch so that EditText can finish setting the selectino. @Override public void run() { int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); // If selStart is different than selEnd, user has highlighed an area of // text; I chose to ignore the click when this happens. if (selStart == selEnd) if (selStart >= 0 && selStart < 10) // or whatever range you want showPopup (this); } }); break; } } return false; } private void showPopup (final EditText text) { Intent intent = new Intent (getContext(), Popup.class); ((Activity)getContext()).startActivity (intent); } }


utiliza este fragmento de código a continuación

this.editText.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //dialogue popup } return false; } });