2012-02-27 18 views
40

En la pantalla de configuración tengo un widget selector de fecha. En el diseñador de Eclipse, se muestra como quiero (3 rotuladores para D-M-Y) pero cuando pruebo en mi dispositivo, obtengo una vista bastante extraña con un rotador lateral a la izquierda y un calendario a la derecha. Nunca he visto esto antes (!) Pero al investigar un poco, creo que estoy viendo el "CalendarView".¿Cómo se desactiva CalendarView en un DatePicker?

Descubrí que debería ser capaz de establecer una propiedad "calendarViewShown" en falso, pero mi XML arroja un error con esto. Encontré otra pregunta aquí que sugería que el nivel API era el culpable (mi minSDKLevel es 7, pero estoy apuntando a 11 para que pueda obtener el botón de la barra de acciones en lugar del menú oldskool). así que pensé que iba a tratar de colocarlo en código:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= 11) 
     minDateSelector.setCalendarViewShown = false; 

Pero, de nuevo, no se encuentra este setCalendarViewShown falla-. Pero los documentos here dicen que debería existir. ¿Alguna idea?

+0

añadir @SuppressLint ("NewApi") en eclipse para suprimir la advertencia y hacer lo que SoloCrowd sugirió. – tobias

+0

¿qué es minDateSelector? – Jilberta

Respuesta

5

Tuve el mismo problema que tú, no pude hacer que el cambio apareciera a través de XML.

Está en el camino correcto, intente modificar la última línea a:

minDateSelector.setCalendarViewShown(false); 
+1

Gracias - He cambiado a una opción de IU diferente ahora, pero podría volver a visitar el selector de fecha, ¡parece que lo anterior funcionará! – James

32

El método de DatePicker

public void setCalendarViewShown (boolean shown) 

existe comenzando con API 11. Si minSdkLevel = 7 El compilador no reconoce esto como un método válido: el método no existe en Android 2.3 o 2.2. La mejor manera es resolver esto utilizando la reflexión. Algo como esto debería funcionar correctamente:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
if (currentapiVersion >= 11) { 
    try { 
    Method m = minDateSelector.getClass().getMethod("setCalendarViewShown", boolean.class); 
    m.invoke(minDateSelector, false); 
    } 
    catch (Exception e) {} // eat exception in our case 
} 
+3

Siempre debe orientar el último SDK; esto es evitar la necesidad de usar la reflexión. –

+0

perfectamente bien para mí. ¡Gracias! si el usuario usa <11, no es mi público objetivo de todos modos. al menos lo salvó de un accidente ahora;) – datayeah

10

En esos casos yo uso

import android.os.Build; 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void someThing() { 
    [...] 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     minDateSelector.setCalendarViewShown(false); 
    } 
} 

Creo que la lectura es mejor que utilizar la reflexión y el estilo es mejor que la captura e ignorar excepciones. Por supuesto, la reflexión también está funcionando.

+0

¿Qué es minDateSelector? – Jilberta

+0

@Jilberta Es una instancia de ['DatePicker'] (http://developer.android.com/reference/android/widget/DatePicker.html). –

92

Si el idioma de una versión posterior de la API, puede utilizar el siguiente código XML (sin necesidad de escribir código Java) en su <DatePicker>:

android:calendarViewShown="false" 
+0

https://developer.android.com/reference/android/widget/DatePicker.html#attr_android:calendarViewShown: de acuerdo con esta documentación, solo es aplicable para el modo "spinner". – ihayet

+0

Ok, entonces, ¿cómo lo haces si * quieres * escribir código Java? – Michael

+0

@Michael puede usar 'setCalendarViewShown (booleano mostrado)' si quiere escribir código Java –

10

hice que funcione con la siguiente configuración XML:

android:datePickerMode="spinner" 
android:calendarViewShown="false" 

Sólo la siguiente configuración no funcionó para mí:

android:calendarViewShown="false" 
Cuestiones relacionadas