根据其他设置在代码中构建首选项屏幕

时间:2012-09-23 11:14:58

标签: android preferences

我在这里搜索并查看了样本,但还没有找到答案本质上是一个简单的问题。根据前面的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;
            }

        });

我确信必须有一个简单的答案来解决我做错了什么,或者我错过了什么!请帮忙......

1 个答案:

答案 0 :(得分: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选项设置屏幕内容时重新使用它们(更改标题和默认值)。每个类别所需的复选框数量可能不同 - 我将为所需的最大数量创建一个数组,然后在每种情况下添加我需要的数量。