在Android中添加动态复选框首选项,并在首选项屏幕中显示它们?

时间:2011-11-27 16:31:48

标签: java android sharedpreferences

我想实现一种功能,用户可以使用复选框共享首选项选择要显示的项目组。确切地说,我将从首选项中阅读检查项目并显示。

这是我的偏好类

 public class Preferences extends PreferenceActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

             //One way to add default preferences
    //addPreferencesFromResource(R.xml.prefs);

             //For now I prefer this
    setPreferenceScreen(defaultPref());

}

    // The first time application is launched this should be read
private PreferenceScreen defaultPref() {
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);

    CheckBoxPreference checkboxPref = new CheckBoxPreference(this);
    checkboxPref.setKey("1");
    checkboxPref.setTitle("SomeRandomStuff");
    root.addPreference(checkboxPref);

    return root;
 }
     public showAllPreferences () {
          // TO SHOW ALL THE PREFERENCES BUT NOT SURE HOW TO DISPLAY THEM
     }
}

现在我无法理解如何动态添加更多偏好并在首选屏幕中显示它们。

这是主要的活动类

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        setContentView(R.layout.main);
    }catch (Exception e) {
        e.printStackTrace();
    }

    exView = (ExpandableListView) findViewById(R.id.expandableListView1);

    // STUFF TO ADD IN PREFERENCES 
    editText = (EditText) findViewById(R.id.editText1);
    //BUTTON TO ADD PREFERENCES.(SEARCH TERM IS IDENTIFIED AND ADDED TO PREF)
    addButton = (ImageButton) findViewById(R.id.imageButton1);
    // BUTTON TO DISPLAY PREFERENCES
    prefButton = (ImageButton) findViewById(R.id.imageButtonPref);

    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
    final SharedPreferences.Editor editor = settings.edit();

    addButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            PrefObject obj = new PrefObject();
            String key = Integer.toString(i);
            String title = editText.getText().toString();
            //prefArray.add(obj);
            editor.putString(key, title);
            editor.commit();
                            i++

        }
    });
    prefButton.setOnClickListener(new OnClickListener() {
        // This method should show the preferences activity with new data
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(Main.this, Preferences.class);
                    startActivity(intent);
                            // I know how to call the intent but I am not sure if
                            // how to read the saved contents and display it
                            Preferences pref = new Preferences();
                            pref.showAllPreferences();  





        }
    });

1 个答案:

答案 0 :(得分:3)

AFAIK,首选项没有“可见性”选项,当你认为它只是一个ListView时,这有点意义。

见[1]。对于我所看到的,你可以做这样的事情:

PreferenceScreen screen = this.getPreferenceScreen();
// Use "1" since you're using "1" to create it.
CheckBoxPreference ckbox = (CheckBoxPreference) this.findPreference("1");
screen.removePreference(ckbox);

要重新创建,您可以执行此操作[2]:

screen.addPreference(ckbox);

此外,请记住使用setOrder(int order)创建您的偏好设置,以便在重新创建时,它将在适当的位置重新创建。

正如您所看到的,可能值得保持对首选项的全局引用,以使其更容易和更快。

当然,我不需要告诉您应该将该逻辑集成到CheckboxPreference侦听器中。除了Reto Meier之外,没有其他人可以看到this answer看到一个好方法(它也是一个复选框)。在那里,他向整个屏幕注册一个监听器,并检查哪个偏好触发了监听器,但是你可以通过设置它setOnPreferenceChangeListener来更简单(但稍后会更详细)。

*编辑:我看到您还使用按钮添加首选项。您还可以在按钮本身中实现上述相同的逻辑。这完全取决于您是否想使用复选框或按钮来执行此操作。

最后,设置启用状态可能是值得的,除非您正在执行类似“查看高级首选项”或类似值的东西,以防止新手用户远离您的应用程序执行危险的操作。但通常情况下,启用状态对用户体验更有效,恕我直言。

我希望这能回答你的问题。