2010-03-01 35 views
55

Quiero un EditText que crea un DatePicker cuando se presiona. Así que escribir el siguiente código:Android EditText onClickListener

mEditInit = (EditText) findViewById(R.id.date_init); 
    mEditInit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(DATEINIT_DIALOG); 
     } 

    }); 

Pero cuando pulso los EditarTexto la acción es la típica: un cursor de espera para escribir texto en lugar de mostrar el cuadro de diálogo que quiero.

¿Alguna idea?

Gracias

+0

Debe utilizar un control de giro en lugar de un cuadro de diálogo EditarTexto. –

Respuesta

14

Aquí está la solución que he implementado

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); 

    } 
}); 

Ver las diferencias por sí mismo. El problema es desde (como dijo RickNotFred) TextView para mostrar la fecha & editar a través del DatePicker. TextEdit no se usa para su propósito principal. Si desea que el DatePicker vuelva a aparecer, debe ingresar delete (1st case) o de focus (2nd case).

Ray

+1

a menos que agregue un onClickListener que acabo de hacer junto con un onFocusChangeListener. Esto funcionará :-) – neteinstein

8

mi humilde opinión no estoy de acuerdo con la declaración de RickNotFred:

estallar un diálogo cuando un EditarTexto consigue enfoque parece como una interfaz no estándar .

Viendo un diálogo para editar la fecha en que el uso de un presiona el EditarTexto es muy similar a la predeterminada, que es para 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 un TextView no editable se le indica al usuario que la fecha no se puede cambiar.

106

El teclado parece aparecer cuando EditText gana foco. Para evitar esto, establece en false enfocable:

<EditText 
    ... 
    android:focusable="false" 
    ... /> 

Este comportamiento puede variar en sabores del sistema operativo Android de diferentes fabricantes, pero en los dispositivos que he probado he encontrado que esto sea suficiente. Si el teclado sigue aparece, el uso de sugerencias en lugar de texto parece ayudar así:

myEditText.setText("My text"); // instead of this... 
myEditText.setHint("My text"); // try this 

Una vez hecho esto, el detector de clics en debería funcionar como se desea:

myEditText.setOnClickListener(new OnClickListener() {...}); 
+0

Esto parece funcionar, pero cuando escribe en un campo, y hace clic en Siguiente en el teclado, omite el campo con focalizable en falso. –

2

Como Dillon Kearns sugirió, establecer enfocable a falso funciona bien. Pero si su objetivo es cancelar el teclado cuando se hace clic en EditarTexto, es posible que desee utilizar:

mEditText.setInputType(0); 
6

Los siguientes funciona perfectamente para mí.

primer conjunto de entrada de su widget de selección de fecha en 'No' para evitar que el teclado en pantalla de aparecer:

<EditText android:inputType="none" ... ></EditText> 

A continuación, agregue estos detectores de eventos para mostrar el cuadro de diálogo que contiene el selector de fechas:

// 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 escritos se copien correctamente del selector de fechas, llame al datePicker.clearFocus() antes de recuperar los valores, por ejemplo, a través del getMonth().

+0

Esto es bueno, pero a veces obtengo diálogos duplicados. – Maxrunner

+0

Solución simple: cierre elDialog antes de cada showDialog, solo para estar seguro. –

30

Tuve este mismo 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!

+0

Esta es una solución muy agradable y fácil :) – Warpzit

+0

nice Yusuf, one up vote for u;) –

+4

Además, no configure enabled = "false", que deshabilitará onClickListener – OatsMantou

3

Esto es lo que funcionó para mí

Conjunto editable en false

<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, añadir 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); 
    } 
} 
}; 
+3

Tenga cuidado con los teléfonos Motorola en funcionamiento Android 2.3.x. Si EditText está en algún lugar en un área desplazable, Motorola moverá automáticamente el foco cuando se desplace. Esto significa que puede desplazarse hacia abajo y cuando EditText gana el foco, aparece su cuadro de diálogo de fecha, que es sorprendente y malo. –

37

Normalmente, desea la máxima compatibilidad con el comportamiento normal de EditText.

Por lo tanto, debe no usar android:focusable="false" ya que, sí, la vista ya no se podrá enfocar, lo que se ve mal. El fondo dibujable ya no mostrará su estado "presionado", por ejemplo.

Lo que debe hacer en su lugar es la 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 a TYPE_NULL, se evita que el teclado de software de aparecer.

Al establecer el OnClickListener y OnFocusChangeListener, se asegura de que su diálogo siempre se abrirá cuando el usuario hace clic en el campo EditText, tanto cuando gana enfoque (primer clic) y en los clics posteriores.

Simplemente estableciendo android:inputType="none" o setInputType(InputType.TYPE_NULL) no siempre es suficiente. Para algunos dispositivos, también debe establecer android:editable="false" en XML, aunque está en desuso. Si ya no funciona, será ignorado (como todos los atributos XML que no son compatibles).

+3

solución perfecta, debería ser la respuesta aceptada – leoderprofi

+0

Cuando hago esto, el cuadro de diálogo vuelve a abrir después de que se cierra porque el texto de edición gana foco nuevamente. De cualquier forma alrededor de esto? – AdamMc331

+0

@ McAdam331 ¿Es ese el componente 'EditText' el único widget en su diseño, tal vez? ¿Puedes intentar agregar 'android: focusable =" true "' a tu diseño principal? – caw

5

Buen tema. Bien, lo he hecho. En archivo XML:

<EditText 
    ... 
    android:editable="false" 
    android:inputType="none" /> 

En Java de código:

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(); 
    } 
}; 
1

¿Por qué nadie menciona setOnTouchListener? Usar setOnTouchListener es fácil y correcto, y solo devuelve verdadero si el oyente ha consumido el evento, de lo contrario, devuelve falso.

1

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); 
    } 

}); 
+1

¡También me funciona! Gracias. –

6

de trabajo predeterminado de EditText: En primer clic y se centra en la segunda posición en que maneja onClickListener Así que hay que desactivar el foco. Luego en el primer clic se manejará el onClickListener.

Para hacer eso, necesita agregar este atributo android:focusableInTouchMode="false" a su 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" /> 
Cuestiones relacionadas