event - checkboxgroup android example
Android EditText onClickListener (13)
Quiero un EditText que crea un DatePicker cuando se presiona. Así que escribo el siguiente código:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
Pero cuando presiono EditarTexto, la acción es la típica: un cursor esperando a escribir texto en su lugar muestra el Diálogo que quiero.
¿Alguna idea?
Gracias
Aquí está la solución que implementé
mPickDate.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
showDialog(DATE_DIALOG_ID);
return false;
}
});
O
mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
showDialog(DATE_DIALOG_ID);
}
});
Vea las diferencias usted mismo. El problema es desde (como dijo RickNotFred) TextView para mostrar la fecha y editar a través del DatePicker. TextEdit no se usa para su propósito principal. Si desea que DatePicker vuelva a aparecer, debe ingresar delete (1st case) o de focus (2nd case).
Rayo
En mi humilde opinión, no estoy de acuerdo con la declaración de RickNotFred:
Hacer estallar un diálogo cuando EditText obtiene un foco parece una interfaz no estándar.
Mostrar un cuadro de diálogo para editar la fecha cuando el uso presiona el Editar texto es muy similar al predeterminado, que es mostrar un teclado o un teclado numérico. El hecho de que la fecha se muestre con EditText indica al usuario que la fecha puede cambiarse. Al mostrar la fecha como una vista de texto no editable se le indica al usuario que la fecha no se puede cambiar.
El teclado parece aparecer cuando EditText gana el foco. Para evitar esto, establezca enfocable en falso:
<EditText
...
android:focusable="false"
... />
Este comportamiento puede variar según los gustos del sistema operativo Android de los fabricantes, pero en los dispositivos que he probado, he encontrado que es suficiente. Si el teclado sigue apareciendo, el uso de pistas en lugar de texto parece ayudar también:
myEditText.setText("My text"); // instead of this...
myEditText.setHint("My text"); // try this
Una vez que haya hecho esto, su escucha en clic debe funcionar como lo desee:
myEditText.setOnClickListener(new OnClickListener() {...});
Como lo sugirió Dillon Kearns, la configuración enfocable a falso funciona bien. Pero si su objetivo es cancelar el teclado cuando se hace clic en EditText, es posible que desee usar:
mEditText.setInputType(0);
Lo siguiente funciona perfectamente para mí.
Primero configure la entrada del widget selector de fecha en ''ninguno'' para evitar que aparezca el teclado virtual:
<EditText android:inputType="none" ... ></EditText>
A continuación, agregue estos detectores de eventos para mostrar el diálogo que contiene el selector de fecha:
// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
showDialog(DIALOG_DATE_PICKER);
}
return false;
}
});
dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showDialog(DIALOG_DATE_PICKER);
} else {
dismissDialog(DIALOG_DATE_PICKER);
}
}
});
Una última cosa. Para asegurarse de que los días, meses o años tipeados se copian correctamente del selector de fechas, llame a datePicker.clearFocus()
antes de recuperar los valores, por ejemplo, a través de getMonth()
.
Yo tuve el mísmo problema. El código está bien, pero asegúrese de cambiar el valor enfocable de EditText a falso.
<EditText
android:id="@+id/date"
android:focusable="false"/>
¡Espero que esto ayude a cualquiera que haya tenido un problema similar!
Esto es lo que funcionó para mí
Establecer editable en falso
<EditText android:id="@+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"
/>
A continuación, agregue un detector de eventos para OnFocusChange
private View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
showDialog(DATE_DIALOG_ID);
}
}
};
Normalmente, quieres la máxima compatibilidad con el comportamiento normal de EditText
.
Por lo tanto, no debe usar android:focusable="false"
ya que, sí, la vista ya no se podrá enfocar y se verá mal. El fondo dibujable ya no mostrará su estado "presionado", por ejemplo.
Lo que debes hacer es lo siguiente:
myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// showMyDialog();
}
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// showMyDialog();
}
}
});
Al establecer el tipo de entrada en TYPE_NULL
, TYPE_NULL
que TYPE_NULL
el teclado del software.
Al configurar OnClickListener
y OnFocusChangeListener
, se asegura de que su cuadro de diálogo siempre se abra cuando el usuario hace clic en el campo EditText
, tanto cuando se enfoca (primer clic) como en los clics posteriores.
Simplemente configurar android:inputType="none"
o setInputType(InputType.TYPE_NULL)
no siempre es suficiente. Para algunos dispositivos, también debe configurar android:editable="false"
en XML, aunque está en desuso. Si ya no funciona, será ignorado (como todos los atributos XML que no son compatibles).
Buen tema Bien, lo he hecho. En archivo XML:
<EditText
...
android:editable="false"
android:inputType="none" />
En código Java:
txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);
private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
@Override
public void onClick(View view) {
dpDialog.show();
}
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
dpDialog.show();
}
};
¿Por qué nadie mencionó setOnTouchListener
? El uso de setOnTouchListener
es fácil y correcto, y solo devuelve verdadero si el oyente ha consumido el evento, de lo contrario es falso.
Esto funciona para mí:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus)
{
mEditInit.callOnClick();
}
}
});
mEditInit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
EditText
predeterminado de EditText
: al hacer clic primero se enfoca y al segundo clic se maneja en onClickListener
por lo que debe deshabilitar el enfoque. Luego, con el primer clic, se encargará onClickListener
.
Para hacer eso, necesitas agregar este android:focusableInTouchMode="false"
atributo a tu EditText
. ¡Eso es!
Algo como esto:
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:inputType="text" />
Actualización del autor: la respuesta a continuación, aunque aceptada en ese momento (en los días de Eclair), es en gran parte irrelevante hoy. Los estándares de UX han evolucionado dramáticamente desde que fue escrito. Manteniendo la integridad y porque no puede eliminar una respuesta aceptada.
Hacer estallar un diálogo cuando EditText obtiene un foco parece una interfaz no estándar. Tenga en cuenta que la función normal de EditText se elude por completo, ya que ni siquiera podría hacer cambios en la fecha que eligió, porque cada vez que lo enfoca, aparece este cuadro de diálogo.
Ya que lo está usando como una Vista de texto, ¿por qué no simplemente usar un TextView real junto con un botón? Cuando se hace clic en el botón, abre el DatePicker y llama a TextView.setText () con la fecha formateada de la manera que quieras. Puede usar onClickListener para el botón y se comportará como espera. Creo que esto hará que la función sea más clara para los usuarios.