2012-09-17 52 views
18

¿Cómo creo un spinner de Android que abre un cuadro de diálogo de selector de fecha?Cómo hacer un spinner de fecha en Android

Quiero un Spinner que se parece al de la aplicación de calendario, como se muestra en la captura de pantalla a continuación.

Screenshot of Android calendar app, with the desired GUI element highlighted

lo que ya he intentado:

Hice una ruleta en mi XML disposición y trataron de establecer el atributo onclick para llamar a un método que muestra el cuadro de diálogo. Cuando puse un nombre de método en "al hacer clic", obtuve un error que dice "No se encontraron las siguientes clases: - Spinner (Cambiar a android.widget.Spinner, Fix Build Path, Edit XML)".

<Spinner 
    android:id="@+id/spinner1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:onClick="showDatePickerDialog" /> 

showDatePickerDialog está en la clase derecha:

public void showDatePickerDialog(View v) { 
    DialogFragment newFragment = new DatePickerFragment(); 
    newFragment.show(getFragmentManager(), "Date"); 
} 

Y esto es DatePickerFragment (copiado de otro sitio web):

import java.util.Calendar; 

import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.widget.DatePicker; 

public class DatePickerFragment extends DialogFragment 
         implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     // Use the current date as the default date in the picker 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) { 
     // Do something with the date chosen by the user 
    } 
} 

SOLUCIÓN:

he encontrado la solución a another question.

que utiliza una ruleta regular en el archivo de diseño, a continuación, en mi clase de actividad, tiene este código:

dateSpinner = (Spinner)findViewById(R.id.spinner_date); 

View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
      showDatePickerDialog(v); 
     } 
     return true; 
    } 
}; 

View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { 
      showDatePickerDialog(v); 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
}; 

dateSpinner.setOnTouchListener(Spinner_OnTouch); 
dateSpinner.setOnKeyListener(Spinner_OnKey); 

Parece un poco hackeado, pero funciona. ¿Alguien sabe una manera más limpia de hacerlo? No me dejaría establecerOnClickListener() o setOnItemClickListener() en el spinner.

+0

Su pregunta es muy amplia, al menos muéstrenos lo que ya ha intentado. No puede esperar que nos sentemos allí durante horas ideando métodos complejos para usted. Escribe tu propio código, luego si tienes algún problema o error, ENTONCES vuelves aquí. –

Respuesta

13

Creo que en general lo que se hace en este caso es utilizar un botón y el estilo es como una ruleta (an approach here, I think a better approach, en su mayoría sólo de seleccionar el estilo de android.R.attr.spinnerStyle), o que utilizan un control de giro, pero sobrecargue la acción de clic para crear un diálogo.

Por supuesto, la parte más difícil es crear el cuadro de diálogo personalizado que tiene buen día/día/año spin-ie-things (no son spinners ... son como máquinas tragamonedas o algo así) en ellos!

Hay varias maneras de hacerlo, hay documentación de google aquí, y siempre puedes simplemente levantar el android source code (aunque obviamente hay inconvenientes).

+0

¡Sí, encontré la respuesta que estaba buscando! – Chickenbellyfinn

1

Un botón es la mejor manera, solo tiene que cambiar el estilo del botón. Intenté establecer el estilo predeterminado del androide en mi botón, pero no funciona correctamente. Así que hice mi propio estilo (es una copia del estilo de ruleta predeterminado). Aquí está:

`<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:state_enabled="false" 
       android:drawable="@drawable/spinner_disabled_holo_light" /> 
     <item android:state_pressed="true" 
       android:drawable="@drawable/spinner_pressed_holo_light" /> 
     <item android:state_pressed="false" android:state_focused="true" 
       android:drawable="@drawable/spinner_focused_holo_light" /> 
     <item android:drawable="@drawable/spinner_default_holo_light" /> 
    </selector> 

`

Las imágenes que se encuentran en .. \ SDK \ plataformas \ androide - %% \ data \ res \ dibujable.

Esto funciona bien para mí. Esta es una forma sencilla de hacer un estilo de botón giratorio, como la rueda giratoria en Google Calendar.

9

Pude lograrlo muy fácilmente.Se ve exactamente igual que la de la aplicación de calendario :)

Use un TextView y darle un estilo spinner:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    style="@android:style/Widget.Holo.Spinner" /> 

Para API 10 y por debajo sin el Holo temático, utilice:

style="@android:style/Widget.Spinner" 
+0

Esta es ciertamente una solución elegante. –

Cuestiones relacionadas