2011-08-05 24 views
4

我生成一个基于xml(entries和entryValues)的listPreference对话框。Android:ListPreference隐藏/禁用值

<string-array name="listArray"> 
    <item>Title (A-Z)</item> 
    <item>Title (Z-A)</item> 
    <item>Visits (default)</item> 
    <item>Date</item> 
    <item>Manual</item> 
</string-array> 
<string-array name="listValues"> 
    <item>titleASC</item> 
    <item>titleDESC</item> 
    <item>visitsSort</item> 
    <item>createSort</item> 
    <item>manualSort</item> 
</string-array> 

我想基于一些其他参数来隐藏/禁用一些条目(例如:手动)。

我的理解应该是这样的范围内:

Preference sorted = (Preference) findPreference(OPT_SORT); 

     sorted.setOnPreferenceClickListener(new OnPreferenceClickListener() { 
      public boolean onPreferenceClick(Preference preference) { 

       if (params) { 
        What should i put here to hide/disable some of the entries? 
       } 

       return true; 
      } 
     }); 

谢谢!

EDIT

我发现最好的解决办法是加载一组不同的条目和EntryValues的。 偏好类(的onCreate):

ListPreference sortBy = (ListPreference) findPreference(OPT_SORT); 
     if (isTabletDevice()) { 
      sortBy.setEntries(getResources().getStringArray(R.array.HClistArray)); 
      sortBy.setEntryValues(getResources().getStringArray(R.array.HClistValues)); 
     } 

希望这有助于任何人! :)

回答

2

AFAIK,ListPreference不支持此操作。您可能可以创建自己的子类ListPreference,您可以在其中使用自定义Adapter并指示哪些项目未启用。

+0

OK感谢。以编程方式加载一组不同的Entries和EntryValues的方法? 我的意思是使用listPref.setEntries()和listPref.setEntryValues(),但是来自XML而不是CharSequence []。 –

+0

nm,找到它:) –

2

这是相当晚的答案,我希望这会有所帮助。

private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list. 
      ListPreference listPreference = (ListPreference) preference; 
      int index = listPreference.findIndexOfValue(stringValue); 

      // Set the summary to reflect the new value. 
      preference 
        .setSummary(index >= 0 ? listPreference.getEntries()[index] 
          : null); 


      // If it's sync_factory_list, enable/disable appropriate settings 
      if(preference.getKey().equalsIgnoreCase("sync_factory_list")){ 

       Preference p_api_key = preference.getPreferenceManager().findPreference("ws_api_key"); 
       Preference p_api_url = preference.getPreferenceManager().findPreference("ws_api_url"); 

       switch (index) { 
        case 0: //local 
         p_api_key.setEnabled(false); 
         p_api_url.setEnabled(false); 
         break; 
        case 1: //prestashop webservice 
         p_api_key.setEnabled(true); 
         p_api_url.setEnabled(true); 
         break; 
        case 2: //thrift 
         p_api_key.setEnabled(false); 
         p_api_url.setEnabled(false); 

         break; 

        default: 
         p_api_key.setEnabled(false); 
         p_api_url.setEnabled(false); 
         break; 
       } 

      } 



     } 
    ... 
    return true; 
} 

}