2010-11-18 10 views
14

J'ai des préférences de travail et j'utilise une combinaison de CheckBoxPreference et EditTextPreference. Je voudrais remplacer l'un d'eux par un DatePickerDialog. Lorsque mon écran de paramètres s'affiche, si vous cliquez sur l'une des préférences, je voudrais que la boîte de dialogue de sélection de date apparaisse pour que l'utilisateur sélectionne une date et enregistre la date sélectionnée dans les préférences. J'ai vu ce travail dans d'autres applications, mais je ne vois pas comment faire cela.Comment utiliser DatePickerDialog en tant que préférence

J'ai la boîte de dialogue de sélection de date fonctionnant à partir d'une vue régulière (selon le tutoriel), mais je voudrais l'utiliser à partir d'une préférence.

Répondre

4

Vous auriez besoin de créer un DialogPreference personnalisé incorporant un DatePicker. Here is a project montrant un DialogPreference personnalisé basé sur un widget personnalisé ColorMixer.

+1

Cela me aide beaucoup, merci. J'ai créé une classe personnalisée, mais comment l'ajouter à mes préférences existantes? Mes préférences existantes ont été définies en XML. Comment puis-je l'ajouter et en faire mon tiers des dix préférences? – mlw

+1

@MLW: Ajoutez-le simplement en tant qu'élément. Vous devrez qualifier complètement le nom de la classe (par exemple, '). – CommonsWare

+0

Merci, cela fonctionne! – mlw

8

Here est une implémentation prête à l'emploi dans votre projet en tant que lib.

Pour citer la source:

l'utiliser comme toute autre préférence dans votre XML PREFERENCE:

<org.bostonandroid.datepreference.DatePreference 
     android:key="dob" android:title="@string/dob" 
     android:defaultValue="1991.01.01" /> 
+0

merci beaucoup, l'homme :) – Roman

+0

Ceci est le meilleur. Il devrait y avoir un changement dans cette classe et c'est que public static DateFormat summaryFormatter() 'devrait retourner' SimpleDateFormat.getDateInstance (DateFormat.LONG); 'pour utiliser le format de date local des utilisateurs. – Roel

0

Alors que la recherche d'un TimePicker à utiliser dans les préférences, j'ai trouvé ce fil. Je tiens à souligner qu'il existe également un projet TimePicker dans ce repo (link).

Le seul problème est que default.jardesc n'est pas disponible, mais peut facilement être créé à partir du projet correspondant dans le projet DatePicker.

18

Grâce à @commonsware. J'ai suivi son projet et créé une boîte de dialogue de sélection de date. Donc ça va aider quelqu'un.

Suivez les étapes pour ouvrir le sélecteur de date dans la fenêtre de préférences.

1. Créez une préférence de boîte de dialogue personnalisée pour le sélecteur de date.

package com.packagename; 

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.preference.DialogPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.DatePicker; 

public class DatePreference extends DialogPreference { 
    private int lastDate = 0; 
    private int lastMonth = 0; 
    private int lastYear = 0; 
    private String dateval; 
    private CharSequence mSummary; 
    private DatePicker picker = null; 
    public static int getYear(String dateval) { 
     String[] pieces = dateval.split("-"); 
     return (Integer.parseInt(pieces[0])); 
    } 

    public static int getMonth(String dateval) { 
     String[] pieces = dateval.split("-"); 
     return (Integer.parseInt(pieces[1])); 
    } 

    public static int getDate(String dateval) { 
     String[] pieces = dateval.split("-"); 
     return (Integer.parseInt(pieces[2])); 
    } 

    public DatePreference(Context ctxt, AttributeSet attrs) { 
     super(ctxt, attrs); 

     setPositiveButtonText("Set"); 
     setNegativeButtonText("Cancel"); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     picker = new DatePicker(getContext()); 

     // setCalendarViewShown(false) attribute is only available from API level 11 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      picker.setCalendarViewShown(false); 
     } 

     return (picker); 
    } 

    @Override 
    protected void onBindDialogView(View v) { 
     super.onBindDialogView(v); 

     picker.updateDate(lastYear, lastMonth + 1, lastDate); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     super.onDialogClosed(positiveResult); 

     if (positiveResult) { 
      lastYear = picker.getYear(); 
      lastMonth = picker.getMonth(); 
      lastDate = picker.getDayOfMonth(); 

      String dateval = String.valueOf(lastYear) + "-" 
        + String.valueOf(lastMonth) + "-" 
        + String.valueOf(lastDate); 

      if (callChangeListener(dateval)) { 
       persistString(dateval); 
      } 
     } 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return (a.getString(index)); 
    } 

    @Override 
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 
     dateval = null; 

     if (restoreValue) { 
      if (defaultValue == null) { 
       Calendar cal = Calendar.getInstance(); 
       SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); 
       String formatted = format1.format(cal.getTime()); 
       dateval = getPersistedString(formatted); 
      } else { 
       dateval = getPersistedString(defaultValue.toString()); 
      } 
     } else { 
      dateval = defaultValue.toString(); 
     } 
     lastYear = getYear(dateval); 
     lastMonth = getMonth(dateval); 
     lastDate = getDate(dateval); 
    } 

    public void setText(String text) { 
     final boolean wasBlocking = shouldDisableDependents(); 

     dateval = text; 

     persistString(text); 

     final boolean isBlocking = shouldDisableDependents(); 
     if (isBlocking != wasBlocking) { 
      notifyDependencyChange(isBlocking); 
     } 
    } 

    public String getText() { 
     return dateval; 
    } 

    public CharSequence getSummary() { 
     return mSummary; 
    } 

    public void setSummary(CharSequence summary) { 
     if (summary == null && mSummary != null || summary != null 
       && !summary.equals(mSummary)) { 
      mSummary = summary; 
      notifyChanged(); 
     } 
    } 
} 

2. Ajoutez le code suivant dans xml préférence situé dans "res/xml/yourpreference.xml"

<com.packagename.DatePreference 
android:key="keyname" 
android:title="Title of the preference" 
android:defaultValue="2014-08-01" 
android:summary="Summary"/> 

Note: Changer le "keyname", "Titre de la préférence", "01/08/2014", "résumé "à votre demande

3. Si vous souhaitez modifier les valeurs par défaut via Activité de préférence, utilisez le code suivant.

package com.packagename; 

import android.os.Bundle; 
import com.packagename.DatePreference; 

public class CustomPreference extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    addPreferencesFromResource(R.xml.preferences); 

    final DatePreference dp= (DatePreference) findPreference("keyname"); 
    dp.setText("2014-08-02"); 
    dp.setSummary("2014-08-02"); 
    dp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference,Object newValue) { 
      //your code to change values. 
      dp.setSummary((String) newValue); 
      return true; 
     } 
    }); 

    } 
} 

Profitez maintenant ...

+0

salut, pourquoi avez-vous fait une autre dateval locale à onDialogClosed? – user3290180

+3

Il y a un petit bug là-bas mois devrait être +1 – user1209216

+0

C'est bon. Mais dans tous les exemples avec des dates et des heures, je vois des formats de date en dur. Dans de nombreux pays, les formats de date sont différents. Vous devez utiliser le format de date local de l'appareil! – Roel

Questions connexes