2012-09-23 46 views
1

我已經在這裏搜索,看樣品,但還沒有找到一個答案本質上是一個簡單的問題。根據在前面的ListPreference中做出的選擇,我想要在代碼中動態地構建CheckBoxPreferences的首選項屏幕,然後在單擊具有點擊監聽器的簡單首選項時顯示該屏幕。每種情況下複選框的列表和數量都不相同。建立代碼取決於另一個設置偏好屏幕

這是我到目前爲止 - 只是一個簡單的代碼來測試onClick監聽器的概念,但如何獲得複選框首選項屏幕出現?必須有一個簡單的解釋,爲什麼它沒有。我究竟做錯了什麼?我的XML代碼

部分:

<PreferenceCategory android:title="Filters"> 
    <PreferenceScreen android:key="FilterScreen" 
     android:title="Filters" android:summary="Click to change filter settings"> 
     <ListPreference android:title="Filter type" 
      android:summary="Set to: Gliding" 
      android:key="filterType" 
      android:defaultValue="0" 
      android:entries="@array/filterTypeOptions" 
      android:entryValues="@array/filterTypeValues" /> 
     <CheckBoxPreference android:title="" 
      android:summary="Include Aerodrome Notams" 
      android:defaultValue="false" android:key="filterIncludeAerodrome" /> 
     <CheckBoxPreference android:title="" 
      android:summary="Delete night-time Notams" 
      android:defaultValue="true" android:key="filterDeleteNighttime" /> 
     <ListPreference android:title="Select category to change" 
      android:summary="Set to: Airspace organisation" 
      android:key="filterCategory" 
      android:defaultValue="0" 
      android:entries="@array/filterCategoryOptions" 
      android:entryValues="@array/filterCategoryValues" /> 
     <Preference android:title="Show filters for category" 
      android:summary="Click to choose subjects to delete" 
      android:key="filterShow" /> 
    </PreferenceScreen> 
</PreferenceCategory> 

了「顯示過濾器類」內容將取決於「過濾器類型」和「選擇類別以更改」設置。

這是一個簡單的測試代碼我有一個「顯示過濾器」點擊監聽器(剛切下來顯示要領):

public class Settings extends PreferenceActivity 
        implements OnSharedPreferenceChangeListener 
{ 
    ------ 
    public static final String KEY_FILTER_SHOW = "filterShow"; 

    ------ 
    private Preference mFilterShow; 

    ------ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.layout.settings); 

     // Get a reference to the preferences 

     ------ 
     mFilterShow = (Preference)findPreference(KEY_FILTER_SHOW); 

     ------ 
     // Set the click listener for Show Filter options 
     mFilterShow.setOnPreferenceClickListener(new OnPreferenceClickListener() 
     { 
      public boolean onPreferenceClick(Preference pref) 
      { 
       Context ctx = pref.getContext(); 
       PreferenceScreen screen = 
        pref.getPreferenceManager().createPreferenceScreen(ctx); 
       CheckBoxPreference cb1 = new CheckBoxPreference(ctx); 
       cb1.setTitle("This is cb1"); 
       cb1.setKey("cb1_key"); 
       cb1.setDefaultValue(false); 
       screen.addPreference(cb1); 
       return true; 
      } 

     }); 

我相信,必須有一個簡單的答案我有什麼做錯了,或者我錯過了!請幫忙...

+0

我發現如果我添加一行「setPreferenceScreen(screen);」就在「返回true」之前,當我單擊Show Filters首選項時,似乎沒有任何事情發生。但是,如果我點擊「返回」,cb1屏幕出現!如果我再次點擊「返回」,它會將我從設置中徹底退出。所以我覺得我差不多在那裏...... –

+0

接近一點。我在xml中將顯示過濾器首選項更改爲PreferenceScreen,並將PreferenceScreen屏幕= ...改爲=(PreferenceScreen)getPreferenceScreen()。findPreference(KEY_FILTER_SHOW);並刪除了前面評論中提到的臨時setPreferenceScreen(屏幕)。現在,第一次點擊不會顯示任何內容,但第二次點擊顯示兩個cb1,每次後續點擊都會添加一個cb1(這是預期的)。但我不明白爲什麼第一次點擊不會顯示帶有單個cb1的屏幕。點擊'返回'現在按預期工作。 –

回答

3

好的,我已經通過迭代過程自己解決了這個問題!其他人可能覺得這很有用。

在XML只需創建一個空的PreferenceScreen:

 <PreferenceScreen android:title="Show filters for category" 
      android:summary="Click to choose subjects to delete" 
      android:key="filterShow"> 
     </PreferenceScreen> 

然後在代碼中有沒有必要的的onClick監聽器 - 屏幕在OnCreate函數創建的內容。實際上,因爲屏幕上的內容需要改變時,在分類列表中的偏好做出的選擇(見原碼)的變化,這需要在一個單獨的功能,這是從的onCreate稱爲既和onSharedPreferenceChanged去:

public static final String KEY_FILTER_SHOW = "filterShow"; 
...  
private PreferenceScreen mFilterShow; 
... 

// In onCreate: 

    // Get a reference to the PreferenceScreen 
    mFilterShow = 
     (PreferenceScreen)getPreferenceScreen().findPreference(KEY_FILTER_SHOW); 

    // Now the code to create the contents of the screen 
    mFilterShow.removeAll(); 
    CheckBoxPreference cb1 = new CheckBoxPreference(this); 
    cb1.setTitle("This is cb1"); 
    cb1.setKey("cb1_key"); 
    cb1.setDefaultValue(true); 
    mFilterShow.addPreference(cb1); 

以上只是「概念驗證」。它的工作原理與您期望的完全相同。在我的最終版本中,我將首先創建一個帶有'new'的CheckBoxPreferences數組,然後在爲每個Category選項設置屏幕內容時重新使用它們(更改標題和默認值)。每個類別所需的複選框數量可能不同 - 我將爲所需的最大數量創建一個數組,然後在每種情況下添加儘可能多的數字。