【问题标题】:Dynamically create CheckBoxPreferences动态创建 CheckBoxPreferences
【发布时间】:2011-09-10 11:33:38
【问题描述】:

我目前正在使用 Web 服务中的内容动态构建带有复选框的行列表。然而,这个ListView 将需要完成PreferenceActivity 将完成的工作。

我不知道行数,因为内容是动态的,所以我无法在 XML 中创建每个 CheckBoxPreference。如何构建一个PreferenceActivity,它将动态显示带有CheckBoxPreference 的未知数字行?

【问题讨论】:

    标签: android dynamic preferenceactivity checkboxpreference


    【解决方案1】:

    为此,您需要ListViewPreferenceActivity。正如this link 中所讨论的,PreferenceActivity 应该只用于实际保存首选项。

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

    或者使用ListView,就像 Google 提供的 API 示例中一样,他们给出了一个简单的示例:

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

    【讨论】:

    • 感谢您的快速回复。此列表用于保存首选项。此列表中的项目是应用程序内容的过滤器设置,这些过滤器是从 Web 服务中提取的。不用管这个应用程序如何工作背后的逻辑,我只需要知道如何在每一行中使用 CheckBoxPreferences 以编程方式正确构建动态 PreferenceActivity。听起来就像只使用我知道的 ListView,但如果可以使用首选项代替它,它将为我节省大量时间,因为这就是它需要的功能。
    【解决方案2】:

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

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

    【讨论】:

    • 对于标题:checkBoxPreference.setTitle("my title");
    【解决方案3】:

    @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 解决方案,效果很好。您必须阅读 cmets 才能找到有关如何调试代码的线索...

    【讨论】:

    • 这是要走的路。
    • 你让我开心了一整天。明确的答案,并通过使用带有列表的 PreferenceCategory 显示了更多信息。谢谢!
    【解决方案4】:

    使用 Preference Compat 库中的 PreferenceFragmentCompat

    编译'com.android.support:preference-v7:23.4.0'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2018-06-28
      • 2013-09-07
      • 2012-03-13
      • 2012-05-03
      • 2011-10-17
      相关资源
      最近更新 更多