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;
            }

        });

我敢肯定,我做错了什么,或者我错过了什么,一定有一个简单的答案!请帮忙...

4

1 回答 1

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);

以上只是“概念证明”。它完全按照您的预期工作。在我的最终版本中,我将首先创建一个带有“新”的 CheckBoxPreferences 数组,然后在为每个类别选项设置屏幕内容时重新使用它们(更改标题和默认值),因为它会发生变化。每个类别所需的复选框数量可能不同 - 我将为所需的最大数量创建一个数组,然后在每种情况下添加我需要的数量。

于 2012-09-24T10:47:56.220 回答