2010-11-18 22 views
14

मेरे पास प्राथमिकताएं काम कर रही हैं और मैं चेकबॉक्स प्रेफरेंस और एडिटटेक्स्ट प्रेफरेंस के संयोजन का उपयोग कर रहा हूं। मैं उनमें से एक को डेटपिकरडियलॉग से बदलना चाहता हूं।वरीयता के रूप में DatePickerDialog का उपयोग कैसे करें

जब मेरी सेटिंग्स स्क्रीन दिखाई दे रही है, यदि आप प्राथमिकताओं में से किसी एक पर क्लिक करते हैं, तो मैं दिनांक चुनने के लिए उपयोगकर्ता के लिए पॉप पिकर संवाद चाहता हूं और प्राथमिकता में चुनी गई तारीख को सहेज सकता हूं। मैंने यह काम अन्य ऐप्स में देखा है, लेकिन मैं नहीं देख सकता कि यह कैसे करें।

मेरे पास नियमित दृश्य (ट्यूटोरियल के अनुसार) से काम करने वाला दिनांक पिकर संवाद है, लेकिन मैं इसे वरीयता से उपयोग करना चाहता हूं।

उत्तर

4

आपको को एक कस्टम DialogPreference बनाना होगा। कस्टम ColorMixer विजेट पर आधारित Here is a project एक कस्टम DialogPreference दिखा रहा है।

+1

यह मैं एक बहुत मदद करता है, धन्यवाद। मैंने एक कस्टम क्लास बनाया है लेकिन अब मैं वास्तव में इसे अपनी मौजूदा प्राथमिकताओं में कैसे जोड़ूं? मेरी मौजूदा वरीयताओं को एक्सएमएल में परिभाषित किया गया था। मैं इसे कैसे जोड़ सकता हूं और इसे दस प्राथमिकताओं में से अपना तीसरा बना सकता हूं? – mlw

+1

@MLW: बस इसे एक तत्व के रूप में जोड़ें। आपको कक्षा के नाम को पूरी तरह अर्हता प्राप्त करने की आवश्यकता होगी (उदा।, ' ')। – CommonsWare

+0

धन्यवाद, यह काम करता है! – mlw

8

Here एक क्रियान्वयन आपके प्रोजेक्ट में एक lib के रूप में उपयोग करने के लिए तैयार है।

सिर्फ अपने PreferenceScreen एक्सएमएल में किसी भी अन्य वरीयता जैसे कि यह प्रयोग करें:

स्रोत के शब्दों में

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

बहुत धन्यवाद, आदमी :) – Roman

+0

यह सबसे अच्छा है। इस वर्ग में एक बदलाव होना चाहिए और यह है कि 'सार्वजनिक स्थैतिक दिनांकफॉर्मैट सारांशफॉर्मेटर()' को 'सरलडेटाफॉर्मैट.getडेट इंस्टेंस (DateFormat.LONG);' उपयोगकर्ताओं को स्थानीय दिनांक प्रारूप का उपयोग करने के लिए वापस लौटना चाहिए। – Roel

0

जबकि एक timepicker वरीयताओं में उपयोग करने के लिए मैं इस सूत्र पाया की तलाश में। मैं यह इंगित करना चाहता हूं कि उस रेपो (link) में टाइमपिकर प्रोजेक्ट भी है।

एकमात्र समस्या यह है कि default.jardesc उपलब्ध नहीं है, लेकिन आसानी से डेटपिकर प्रोजेक्ट में संबंधित से बनाया जा सकता है।

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। "कीनेम" बदलें "पर वरीयता के शीर्षक", "2014-08-01", "सारांश: वरीयता" रेस/xml/yourpreference.xml "

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

नोट में स्थित एक्सएमएल में निम्न कोड जोड़ें "आपकी आवश्यकता के अनुसार

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

हाय, आपने डीडियोग्लोज़ड पर एक और डेटाल स्थानीय क्यों बनाया? – user3290180

+3

वहां एक छोटी सी बग है जहां +1 होना चाहिए – user1209216

+0

यह अच्छा है। लेकिन तारीखों और समय के साथ सभी उदाहरणों में मैं लोगों को हार्डकोडिंग दिनांक स्वरूपों को देखता हूं। कई देशों में तारीख प्रारूप अलग हैं। आपको डिवाइस के स्थानीय डेटफॉर्मेट का उपयोग करना चाहिए! – Roel

संबंधित मुद्दे