2010-11-18 17 views
14

Tengo preferencias de trabajo y estoy usando una combinación de CheckBoxPreference y EditTextPreference. Me gustaría reemplazar uno de ellos con un DatePickerDialog.Cómo utilizar DatePickerDialog como preferencia

Cuando aparece mi pantalla de configuración, si hace clic en una de las preferencias, me gustaría que aparezca el cuadro de diálogo del selector de fecha para que el usuario seleccione una fecha y guarde la fecha seleccionada en las preferencias. He visto este trabajo en otras aplicaciones, pero no puedo ver cómo hacerlo.

Tengo el diálogo selector de fecha trabajando desde una vista normal (según el tutorial), pero me gustaría usarlo de una preferencia.

Respuesta

4

Debería crear un DialogPreference personalizado que incorpore un DatePicker. Here is a project mostrando un DialogPreference personalizado basado en un widget personalizado ColorMixer.

+1

Esto me ayuda mucho, gracias. Creé una clase personalizada, pero ahora ¿cómo puedo agregarla a mis preferencias existentes? Mis preferencias existentes se definieron en XML. ¿Cómo puedo agregarlo y convertirlo en mi tercera preferencia de diez? – mlw

+1

@MLW: simplemente agrégalo como un elemento. Necesitará calificar completamente el nombre de clase (por ejemplo, ''). – CommonsWare

+0

¡Gracias, esto funciona! – mlw

8

Here es una implementación lista para usar en su proyecto como lib.

Para citar la fuente:

utilizarlo apenas como cualquier otra preferencia en su XML PREFERENCE:

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

muchas gracias, hombre :) – Roman

+0

Este es el mejor. Debería haber un cambio en esta clase y es que 'public static DateFormat summaryFormatter()' debería devolver 'SimpleDateFormat.getDateInstance (DateFormat.LONG);' para usar el formato de fecha local de los usuarios. – Roel

0

bien en busca de un TimePicker a utilizar en las preferencias He encontrado este hilo. Me gustaría señalar que también hay un proyecto TimePicker en ese repositorio (link).

El único problema es que default.jardesc no está disponible, pero se puede hacer fácilmente desde el correspondiente en el proyecto DatePicker.

18

Gracias a @commonsware. Seguí su proyecto y creé un diálogo de preferencia de selector de fecha. Por lo tanto, ayudará a alguien.

Siga los pasos para abrir el selector de fecha en la ventana de preferencias.

1. Cree una preferencia de diálogo personalizada para el selector de fecha.

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. Agregue el código siguiente en XML preferencia situada en "res/xml/yourpreference.xml"

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

Nota: Resumen Cambiar el "nombre de clave", "Título de la preferencia", "2014-08-01", " "según su requisito

3. Si desea cambiar los valores predeterminados a través de la Actividad de preferencias, use el siguiente código.

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

    } 
} 

Ahora disfrutar ...

+0

hola, ¿por qué hiciste otra fecha local en onDialogClosed? – user3290180

+3

Hay un pequeño error allí mes debe ser +1 – user1209216

+0

Esto es bueno. Pero en todos los ejemplos con fechas y horas veo las personas formatos de fecha de codificación. En muchos países, los formatos de fecha son diferentes. ¡Debe usar el formato de fecha local del dispositivo! – Roel

Cuestiones relacionadas