web-dev-qa-db-fra.com

Comment faire un spinner de date sur Android

Comment créer un Android spinner qui ouvre une boîte de dialogue de sélection de date?

Je veux un Spinner qui ressemble à celui de l'application de calendrier, comme indiqué dans la capture d'écran ci-dessous.

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

Ce que j'ai déjà essayé:

J'ai créé un spinner dans ma mise en page XML et j'ai essayé de définir l'attribut onclick pour appeler une méthode qui affiche la boîte de dialogue. Lorsque je mets un nom de méthode dans "on click", je reçois une erreur qui dit "Les classes suivantes sont introuvables: - Spinner (Changer pour Android.widget.Spinner, Fixer le chemin de construction, Modifier XML)".

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

showDatePickerDialog est dans la bonne classe:

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

Et voici DatePickerFragment (copié à partir d'un autre site 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
    }
}

SOLUTION:

J'ai trouvé la solution à ne autre question .

J'ai utilisé un spinner ordinaire dans le fichier de mise en page, puis dans ma classe d'activité, a ce code:

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

Cela semble un peu piraté, mais ça marche. Quelqu'un connaît-il une façon plus propre de le faire? Il ne me laisserait pas setOnClickListener () ou setOnItemClickListener () sur le spinner.

19
Chickenbellyfinn

Je pense qu'en général, ce que les gens font dans ce cas, c'est d'utiliser un bouton et de le styler comme un fileur ( ne approche ici , je pense qu'une meilleure approche , la plupart du temps juste en définissant le style à Android.R.attr.spinnerStyle), ou ils utilisent un spinner mais surchargent l'action de clic pour créer une boîte de dialogue.

Bien sûr, la partie la plus difficile est de créer la boîte de dialogue personnalisée qui contient de belles choses spin-ie-mois/jour/année (ce ne sont pas des filateurs ... ce sont des machines à sous ou quelque chose comme ça)!

Il y a plusieurs façons de s'y prendre, il y a de la documentation google ici, et vous pouvez toujours simplement lever le code source Android (bien qu'il y ait évidemment des inconvénients).

12
xbakesx

J'ai pu y arriver très facilement. Il ressemble exactement à celui de l'application de calendrier :)

Utilisez une TextView et donnez-lui un style spinner:

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

Pour l'API 10 et les versions antérieures sans le thème Holo, utilisez:

style="@Android:style/Widget.Spinner"
11
Olumide Oyetoke

Un bouton est le meilleur moyen, il vous suffit de changer le style du bouton. J'ai essayé de définir le style par défaut Android spinner sur mon bouton, mais cela ne fonctionne pas correctement. J'ai donc créé mon propre style (c'est une copie du style spinner par défaut). Le voici :

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

"

Les images que vous trouverez dans ..\sdk\plates-formes\Android - %%\data\res\drawable.

Cela fonctionne bien pour moi. Il s'agit d'un moyen simple de créer un style de bouton rotatif, comme le bouton rotatif de Google Agenda.

2
Alexandre Vicenzi