2012-09-17 15 views
18

Come si crea uno spinner Android che apre una finestra di dialogo di selezione data?Come creare uno spinner di date su Android

Voglio uno Spinner simile a quello nell'app del calendario, come mostrato nello screenshot qui sotto.

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

Quello che ho già provato:

ho fatto una selezione in mio layout XML e ha cercato di impostare l'attributo onclick di chiamare un metodo che mostra la finestra di dialogo. Quando inserisco il nome di un metodo in "on click", ho ricevuto un errore che dice "Non è stato possibile trovare le seguenti classi: - Spinner (Passare a android.widget.Spinner, Correggi percorso di creazione, Modifica XML)".

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

showDatePickerDialog è nella classe giusta:

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

E questo è DatePickerFragment (copiato da un altro sito):

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

SOLUZIONE:

ho trovato la soluzione a another question.

ho usato un filatore regolare nel file di layout, poi nella mia classe di attività, ha questo codice:

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

Sembra un po 'hacked, ma funziona. Qualcuno sa un modo più pulito per farlo? Non mi ha permesso di impostare setOnClickListener() o setOnItemClickListener() sulla casella di selezione.

+0

La tua domanda è molto ampia, almeno mostraci cosa hai già provato. Non puoi aspettarti che restiamo lì per ore a pensare a metodi complessi per te. Scrivi il tuo codice, quindi se hai qualche problema o errore, torna QUI. –

risposta

13

Penso che, in generale, ciò che le persone fanno in questo caso è usare un pulsante e lo stile come un filatore (an approach here, I think a better approach, per lo più solo impostare lo stile di android.R.attr.spinnerStyle), oppure utilizzare un filatore ma sovraccaricare l'azione click per creare una finestra di dialogo.

Ovviamente la parte difficile è la creazione della finestra di dialogo personalizzata che ha delle buone idee mese-giorno/anno (cioè non sono spinners ... sono un po 'come le slot machine o qualcosa del genere) in esse!

Ci sono alcuni modi per procedere, c'è una documentazione di google qui, e puoi sempre sollevare lo android source code (sebbene ci siano ovviamente degli svantaggi).

+0

Sì, ho trovato la risposta che stavo cercando! – Chickenbellyfinn

1

Un pulsante è il modo migliore, è sufficiente modificare lo stile del pulsante. Ho provato a impostare lo stile Androide predefinito sul mio pulsante, ma non funziona correttamente. Così ho creato il mio stile (è una copia dello stile di selezione predefinito). Eccolo:

`<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> 

`

Le immagini troverete nella .. \ SDK \ piattaforme \ android - %% \ Data \ res \ disegnabili.

Questo funziona per me. Questo è un modo semplice per creare uno stile per la selezione di pulsanti, come lo spinner su Google Calendar.

9

Sono riuscito a raggiungerlo molto facilmente.Sembra esattamente come quella del calendario app :)

Utilizzare un TextView e dargli uno stile filatore:

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

Per API 10 e al di sotto senza il tema Holo, uso:

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

Questa è sicuramente una soluzione elegante. –

Problemi correlati