2010-03-07 15 views
13

मेरे एंड्रॉइड एप्लिकेशन में मेरे पास PreferenceScreen अभिभावक है जिसमें 3 CheckBoxPreferences बच्चे हैं।वरीयता स्क्रीन एंड्रॉइड: सारांश अद्यतन!

जब मैं माता पिता preferenceScreen क्लिक करें, और 3 चेक बॉक्स प्रदर्शित किए जाते हैं, मैं उनमें से एक का चयन करें, और Preference.OnPreferenceChangeListener में चेक बॉक्स के साथ मैं माता पिता के preferenceScreen सारांश सेट के साथ asociated:

Parent.setSummary("string depending on the selection") 

बात यह है कि जब मैं अभिभावक के पास वापस आ जाता हूं, तो सारांश सारांश अपडेट नहीं होता है, भले ही आंतरिक रूप से मूल्य निर्धारित मूल्य में संगत रूप से बदल गया हो।

क्या इस व्यवहार के बारे में कोई भी विचार है?

+0

एक बात यह है कि अगर ब्याज की वरीयता में ही 'CheckBoxPreference' (या अन्य' TwoStatePreference', इस तरह के 'SwitchPreference' के रूप में), तो' नहीं करता setSummary' है काम नहीं करते हैं 'एंड्रॉइड: सारांशऑन' या 'एंड्रॉइड: सारांशऑफ' असाइन किया गया था। इस तरह के मामले में किसी को 'setSummaryOn' और' setSummaryOff' का उपयोग करना चाहिए, जो स्पष्ट IMho नहीं है। – Stan

उत्तर

1

मुझे पता चला कि यह setSummary()getListView().invalidate()

12

उपयोग एक आकर्षण की तरह

Parent.setSummary("string depending on the selection"); 
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

काम करता है और भले ही जगह आप सारांश बदल किया जा सकता है।

+0

यदि स्क्रीन अन्य स्क्रीन के भीतर घोंसला है, तो यह तत्काल मूल स्क्रीन पर किया जाना चाहिए। –

0

गतिविधियों के बजाए टुकड़ों पर नया आग्रह करना कठिन लगता है। invalidate मार्ग अंतर्निहित दृश्य का उपयोग करके काम नहीं करता और न ही दृष्टिकोण प्रतीत होता है। हेलक्सिनेट के जवाब के लिए धन्यवाद, अब मैं इसे काम करने में कामयाब रहा हूं। लोगों के रूप में मैं यह सब यहाँ करने के लिए कर रहा हूँ जो नए रूप में कर रहे हैं में कुछ और विवरण हैं:

जब सेटिंग्स टुकड़ा बनाने, अपने मुख्य गतिविधि में एक संदर्भ, जैसे बचाने:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    switch (item.getItemId()) { 
    case R.id.action_preferences: 
     if (getFragmentManager().getBackStackEntryCount() < 1) { 
      FragmentTransaction trans = getFragmentManager() 
        .beginTransaction(); 
      // Save a reference to the settings fragment 
      settingsFrag = new SettingsFragment(); 
      trans.replace(R.id.container, settingsFrag); 
      trans.addToBackStack(null); 
      trans.commit(); 
     } 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

फिर जब आप चाहते हैं OnSharedPreferenceChangeListener से बाहरी PreferenceScreen के सारांशों को अद्यतन करने के लिए इस प्रकार की चीज़ का उपयोग करें। ध्यान दें कि आप बाहरी PreferenceScreen के लिए अपनी प्राथमिकता टुकड़ा एक्सएमएल में एक महत्वपूर्ण परिभाषित किया है (इस मामले android:key="prefs_root" में) की जरूरत है:

public static void setOuterSummaries(SettingsFragment sf) { 
    // Set the outer preferences summaries 
    if (sf == null) 
     return; 
    //Code to update the summaries.... 

    // Force the parent screen summaries to update 
    prefScr = (PreferenceScreen) sf.findPreference("prefs_root"); 
    if (prefScr != null) 
      ((BaseAdapter) prefScr.getRootAdapter()).notifyDataSetChanged(); 

} 

OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, 
      String key) { 
     Log.e("L", "Change"); 
     setOuterSummaries(settingsFrag); 
    } 
}; 

ध्यान दें कि आप BaseAdapter के बजाय सेटिंग्स टुकड़ा लेकिन इस के लिए एक संदर्भ बचत हो सकती है जब आप बहु-खंड स्थिति या कोड को सामान्यीकृत करने के बारे में सोचते हैं तो दृष्टिकोण सुरक्षित लगता है जो गतिशील रूप से खंड सामग्री बनाता है।

1

यह सही तरीका नोट करने के लिए

Preference pref = findPreference(getString(R.string.key_of_pref)); 
PreferenceScreen parent = (PreferenceScreen) sf.findPreference(getString(R.string.key_of_preference_screen)); 
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     boolean newValueBool = (Boolean) newValue; 
     parent.setSummary(newValueBool ? "Summary is true" : "Summary is false");             
     ((BaseAdapter) getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 
     // true to update the state of the Preference with the new value 
     // in case you want to disallow the change return false 
     return true; 
    } 
}); 
संबंधित मुद्दे