2010-11-18 69 views
14

我有偏好工作,我正在使用CheckBoxPreference和EditTextPreference的组合。我想用DatePickerDialog替换其中的一个。如何使用DatePickerDialog作为首选项

当我的设置屏幕显示时,如果您点击其中一个首选项,我会弹出日期选取器对话框供用户选择一个日期,并将所选日期保存在首选项中。我在其他应用程序中看到过这项工作,但我无法看到如何执行此操作。

我有日常选择器对话框从常规视图(按照教程)工作,但我想从首选项中使用它。

回答

4

您需要创建一个自定义DialogPreference合并DatePickerHere is a project显示基于自定义ColorMixer小部件的自定义DialogPreference

+1

这帮助了我很多,谢谢。我创建了一个自定义类,但是现在我怎样才能将其添加到现有的首选项中?我现有的首选项是用XML定义的。我如何添加它并使其成为我十个偏好中的第三个? – mlw 2010-11-18 16:57:47

+1

@MLW:只需将其添加为一个元素即可。您需要完全限定类名(例如'')。 – CommonsWare 2010-11-18 17:38:04

+0

谢谢,这个工程! – mlw 2010-11-18 18:28:18

8

Here是一个可以在项目中作为lib使用的实现。

要注明出处:

使用它,就像在你的PreferenceScreen XML任何其他偏好:

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

非常感谢,男人:) – Roman 2013-03-13 15:05:48

+0

这是最好的。这个类应该有一个改变,那就是'public static DateFormat summaryFormatter()'应该返回'SimpleDateFormat.getDateInstance(DateFormat.LONG);'使用用户本地日期格式。 – Roel 2016-02-09 10:48:28

0

在寻找一个TimePicker的喜好来使用,我发现这个线程。 我想指出,该回购中还有一个TimePicker项目(link)。

唯一的问题是,default.jardesc不可用,但可以很容易地从DatePicker项目中的相应的一个。

18

感谢@commonsware。我跟随他的项目并创建了日期选择器首选项对话框。所以它会帮助别人。

按照以下步骤在首选项窗口中打开日期选择器。

1。为日期选择器创建自定义对话框首选项。

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。添加以下代码在位于 “RES/XML/yourpreference.xml”

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

注意偏好的xml:改变 “键名”, “首选项的标题”, “2014-08-01”,“摘要“作为您的要求

3。如果您想通过首选项活动更改默认值,请使用以下代码。

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

    } 
} 

享受现在......

+0

嗨,你为什么做onDialogClosed的本地另一个dateval? – user3290180 2015-07-20 12:59:40

+3

那里有一个小错误应该是+1 – user1209216 2015-11-18 09:29:33

+0

这很好。但在所有日期和时间的例子中,我都看到人们使用硬编码日期格式。在许多国家,日期格式不同。您应该使用设备的本地日期格式! – Roel 2016-02-09 10:17:55

相关问题