动态创建CheckBoxPreferences

时间:2011-06-07 23:00:00

标签: android dynamic preferenceactivity checkboxpreference

我目前正在使用来自Web服务的内容动态地构建带有复选框的行列表。但是,ListView需要完成PreferenceActivity所能完成的任务。

由于内容是动态的,我不知道行数,因此我无法在XML中创建每个CheckBoxPreference。如何构建PreferenceActivity,以动态显示CheckBoxPreference的未知数字行?

4 个答案:

答案 0 :(得分:27)

我认为你正在寻找这样的东西:

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_activity);

        //fetch the item where you wish to insert the CheckBoxPreference, in this case a PreferenceCategory with key "targetCategory"
        PreferenceCategory targetCategory = (PreferenceCategory)findPreference("targetCategory");

        //create one check box for each setting you need
        CheckBoxPreference checkBoxPreference = new CheckBoxPreference(this);
        //make sure each key is unique  
        checkBoxPreference.setKey("keyName");
        checkBoxPreference.setChecked(true);

        targetCategory.addPreference(checkBoxPreference);
    }
}

答案 1 :(得分:8)

嗯@Jodes,实际上你们两个都是对的,但这样做的正确方法是使用ListPreference

我会使用整个程序化方法,根据我的经验,它更容易保持一致;要么通过代码创建一个完整的XML布局,要么通过XML创建,但混合2可能很奇怪,你不能改变通过XML设置的所有内容......

onCreate(){
    this.setPreferenceScreen(createPreferenceHierarchy());
}

public PreferenceScreen createPreferenceHierarchy(){
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);

    // category 1 created programmatically
    PreferenceCategory cat1 = new PreferenceCategory(this);
    cat1.setTitle("title");
    root.addPreference(cat1);

    ListPreference list1 = new ListPreference(this);
    list1.setTitle(getResources().getString(R.string.some_string_title));
    list1.setSummary(getResources().getString(R.string.some_string_text));      
    list1.setDialogTitle(getResources().getString(R.string.some_string_pick_title));
    list1.setKey("your_key");

    CharSequence[] entries  = calendars.getCalenders(); //or anything else that returns the right data
    list1.setEntries(entries);
    int length              = entries.length;
    CharSequence[] values   = new CharSequence[length];
    for (int i=0; i<length; i++){
        CharSequence val = ""+i+1+"";
        values[i] =  val;
    }
    list1.setEntryValues(values);

    cat1.addPreference(list1);

    return root;
}//end method

然而,使用这种方法会遇到平台没有多选ListPreference的限制,你可能想要实现别的东西。

我找到了this解决方案,效果很好。您必须阅读注释以找到有关如何调试代码的线索......

答案 2 :(得分:0)

您需要ListViewPreferenceActivity。正如this link中所述,PreferenceActivity只应用于实际保存偏好。

相反,您可以创建一个包含单个或多个选项的简单对话框: http://developer.android.com/guide/topics/ui/dialogs.html

或者像Google提供的API示例一样使用ListView,它们提供了一个简单的示例:

http://hi-android.info/docs/resources/samples/ApiDemos/src/com/example/android/apis/view/List10.html

答案 3 :(得分:0)

使用Preference Compat Library中的PreferenceFragmentCompat

compile&#39; com.android.support:preference-v7:23.4.0&#39;

查看本文以了解实施细节https://medium.com/@arasthel92/dynamically-creating-preferences-on-android-ecc56e4f0789#.71ssvjses