2012-04-05 13 views
6

मुझे ListPreference में गतिशील प्रविष्टियों की आवश्यकता है, इसलिए मैं XML सेटअप के पारंपरिक तरीके का उपयोग नहीं कर सकता जिसके बारे में बहुत सारी सामग्री ऑनलाइन है। अब तक मेरे पास निम्न सेटअप है क्योंकि आप देख सकते हैं। समस्या यह है कि जब मैं इसे चलाता हूं तो मुझे शीर्षक और संदेश के साथ संवाद दिखाई देता है लेकिन कोई प्रविष्टि दिखाई नहीं देती है, भले ही मुझे पता है कि प्रविष्टियां और मान खाली नहीं हैं (मुझे पता है कि मेरी प्रविष्टियां और मान समान हैं लेकिन अगर मैं नहीं करता तो मुझे त्रुटि मिल जाएगी आपूर्ति की प्रविष्टियों)डायनामिक प्रविष्टियों के साथ कस्टम सूची प्राथमिकता


my.preference.DynamicPreference 
      android:title="@string/date_format" 
      android:dialogMessage="@string/profile_info_date_format" 
      android:entryValues="@array/date_format_values" 
      android:entries="@array/date_format_values" 

public class DynamicPreference extends ListPreference { 
    private int index; 

    public DynamicPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DynamicPreference(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 
     builder.setTitle(getTitle()); 
     builder.setMessage(getDialogMessage()); 
     builder.setSingleChoiceItems(entries(), -1, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 

      } 
     }); 
     super.onPrepareDialogBuilder(builder); 
    } 

    @Override 
    public void setEntries(CharSequence[] sequence) { 
     CharSequence[] entries = listObjects().toArray(new CharSequence[listObjects().size()]); 
     super.setEntries(entries); 
    } 

    @Override 
    public void setEntryValues(CharSequence[] sequence) { 
     CharSequence[] values = getContext().getResources().getStringArray(R.string.date_format); 
     super.setEntryValues(values); 
    } 
}

उत्तर

14

एंड्रॉइड: संवाद संदेश यहां अच्छा प्रारंभिक बिंदु था, धन्यवाद @ एमएच। इसे तलाशने के लिए। Bellow साधारण सेटअप मैं के साथ समाप्त हो गया है, मैं किसी को यह उपयोगी

<my.preference.DynamicPreference 
     android:title="@string/local_time" 
     android:key="profile_info_local_time" 
     /> 

public class DynamicPreference extends ListPreference { 


    public DynamicPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DynamicPreference(Context context) { 
     super(context); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     ListView view = new ListView(getContext()); 
     view.setAdapter(adapter()); 
     setEntries(entries()); 
     setEntryValues(entryValues()); 
     setValueIndex(initializeIndex()); 
     return view; 
    } 

    private ListAdapter adapter() { 
     return new ArrayAdapter(getContext(), android.R.layout.select_dialog_singlechoice); 
    } 

    private CharSequence[] entries() { 
     //action to provide entry data in char sequence array for list 
    } 

    private CharSequence[] entryValues() { 
     //action to provide value data for list 
    } 
} 
+0

क्या यह भरने का एकमात्र तरीका है एक प्रोग्रामेटिक तरीके से 'ListPreference'? – enzom83

+0

@ enzom83 यह मूल विचार है कि इसे कैसे करें। मैं सबसे अच्छा होने का दावा नहीं करता हूं, लेकिन जहां तक ​​आप देख सकते हैं कि इसके संबंध में कोई अन्य पोस्ट नहीं है। क्या आपको कुछ समस्याएं हैं? –

+1

@peter_budo: ListPreference को बढ़ाने की कोई आवश्यकता नहीं है, कुछ प्रारंभिक मानों को 'onrereate()' में सेट करने के लिए पर्याप्त है और फिर विशिष्ट ऑब्जेक्ट के लिए 'onPreferenceClick()' हैंडलर को ओवरराइड करें। यहां एक उदाहरण दिया गया है: http://stackoverflow.com/questions/6474707/how-to-fill-listpreference- गतिशील रूप से- when-onpreferenceclick-is-triggered – ccpizza

3

मैं क्यों यह काम नहीं कर रहा अपेक्षा के अनुरूप के लिए कुछ संभावित संभावनाओं को देख सकते हैं:

  1. listObjects कहाँ से आती है? इसकी उपस्थिति से पता चलता है कि यह एक सदस्य चर है, लेकिन मुझे यह सेट नहीं हो रहा है या कहीं भी शुरू किया गया है। जांचें कि आप संवाद को पॉप्युलेट करने के लिए 'खाली' सूची का उपयोग नहीं कर रहे हैं, क्योंकि इससे किसी भी आइटम की अनुपस्थिति हो सकती है। यदि आप कभी भी स्पष्ट रूप से setEntries(...)औरsetEntryValues(...) बुला

  2. वैकल्पिक रूप से, कर रहे हैं? मैं पूछ रहा हूं, क्योंकि ListPreference आंतरिक रूप से उन दो सेटर्स का उपयोग नहीं करता है - इसके लिए यह सीधे निजी सदस्य चर (mEntries और mEntryValues) का उपयोग करता है। दूसरे शब्दों में, यदि आप कभी भी दोनों कार्यों को स्वयं नहीं कहते हैं, तो कोई भी नहीं करेगा, जिसका अर्थ है कि सरणी कभी भी सुपर क्लास पर सेट नहीं होगी; इसलिए खाली संवाद।

  3. मेरे पहले अवलोकन के समान: entries() क्या है? यह onPrepareDialogBuilder में बैठा है, लेकिन ऐसा लगता है कि कहीं भी घोषित नहीं किया जा रहा है।

शायद यह कुछ और कोड के टुकड़े जोड़ना शुरू करने के लिए, यह बताने का कोई रास्ता नहीं है, जहां आपकी समस्या का सही मूल निहित है वहाँ सब कुछ है जिसकी कमी है के आधार पर क्योंकि सबसे अच्छा है ...

संपादित करें: ठीक है , मैंने आपके चरणों का पालन करने के लिए एक त्वरित परीक्षण परियोजना की स्थापना की। आपकी समस्या का समाधान वास्तव में काफी सरल है: android:dialogMessage विशेषता से छुटकारा पाएं, और आपकी सूची आइटम दिखाना चाहिए - मुझे यह जोड़ना होगा कि मैंने केवल सादा ListPreference के साथ इसका परीक्षण किया है।

यदि आप DialogPreference से विस्तारित हैं, तो ListPreference के स्रोत पर जाएं, तो समस्या आसानी से पाई जाती है। ShowDialog() में निम्नलिखित पाया जा सकता है:

285  View contentView = onCreateDialogView(); 
286  if (contentView != null) { 
287   onBindDialogView(contentView); 
288   mBuilder.setView(contentView); 
289  } else { 
290   mBuilder.setMessage(mDialogMessage); 
291  } 
292   
293  onPrepareDialogBuilder(mBuilder); 

अब, जैसा कि आप देख सकते हैं, यह सब क्योंकि समय onPrepareDialogBuilder पर क्या रिटर्न onCreateDialog पर निर्भर करता है, कहा जाता है निर्णय क्या प्रदर्शित करने के लिए पहले से ही किया जाता है। तो चलो कि एक नजर डालते हैं:

336 protected View onCreateDialogView() { 
337  if (mDialogLayoutResId == 0) { 
338   return null; 
339  } 
340   
341  LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
342    Context.LAYOUT_INFLATER_SERVICE); 
343  return inflater.inflate(mDialogLayoutResId, null); 
344 } 

ऐसा प्रतीत होता है कि यह एक संसाधन mDialogLayoutResId द्वारा संदर्भित को बढ़ाने के लिए प्रयास करता है। यदि वह सेट या उपलब्ध नहीं है, तो यह null लौटाएगा और केवल तभी संवाद 'संदेश' दिखाएगा। सामग्री (वस्तुओं के साथ सूची) केवल तभी दिखाएगी जब वैध लेआउट संदर्भित किया गया हो। यदि आप सामग्री और संदेश दोनों को प्रदर्शित करना चाहते हैं, तो आपको android:dialogLayout विशेषता का उपयोग करके एक कस्टम संवाद लेआउट जोड़ना होगा, और TextView को android:id="@android:id/message" आईडी के साथ जोड़ें। ListPreference के मामले में, संदेश डिफ़ॉल्ट रूप से सूची के नीचे दिखाया जाएगा।

ध्यान दें कि को प्रविष्टियों और मूल्यों को प्रोग्रामेटिक रूप से जोड़ने के लिए अंतर्निहित ListPreference को बढ़ाने की आवश्यकता है। ListPreference उदाहरण पर उस डेटा के साथ सरल कॉल setEntries(...) और setEntryValues(...) जिसे आप दिखाना चाहते हैं।

इसके अलावा, आपके DynamicPreference सबक्लास के मामले में, आपके द्वारा बदला गया कोई भी व्यवहार ओवरराइड हो सकता है क्योंकि आप अपनी विधि के अंत में super.onPrepareDialogBuilder(builder) पर कॉल करते हैं। जैसा कि पहले उल्लेख किया गया है: मैंने अभी इसे डिफ़ॉल्ट ListPreference के साथ परीक्षण किया है और ऐसा लगता है कि आप ठीक काम करते हैं और जो कुछ भी आप अनुरोध करते हैं।

+0

1) कोड है कि मैं पोस्ट नहीं किया था का एक हिस्सा है, लेकिन मैं आपको आश्वस्त कर सकता है कि इसे वापस सरणी करता अपेक्षा के अनुरूप मिल सकता है उम्मीद है। 2) उन्हें कहीं भी नहीं बुलाओ, ऐसा लगता है कि मैं उनका उपयोग गलत समझ सकता हूं। 3) पहले मामले में, कोड का हिस्सा जो मैंने पोस्ट नहीं किया था और फिर यह वैध ऑब्जेक्ट –

+0

वापस करता है कृपया अपनी समस्या और समाधान दोनों कारणों के लिए मेरे उत्तर में संपादन पर एक नज़र डालें। बाहर निकलता है आपको 'ListPreference' subclass करने की आवश्यकता नहीं है। :) –

+0

हां, यह उस विशेषता के बिना काम करता है। डायलॉग प्रेफरेंस I का विस्तार करने वाले अन्य वर्गों में अब तक इसका कोई समस्या नहीं है। मैंने छोटी खोज की और ऐसा लगता है कि एक्सएमएल विशेषता एंड्रॉइड: ListPreference के लिए संवाद संदेश एंड्रॉइड बग सूची पर है http://code.google.com/p/android/issues/detail?id=4497 –

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