从不同的视图调用相同的PreferenceActivity,不同的值

时间:2015-10-02 03:42:47

标签: android xml preferenceactivity preferencescreen

假设我有10个按钮,ID为1,2,...,10。我有一个名为preferences.xml的XML文件,其中包含一个复选框:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="applicationPreference" android:title="@string/config">
   <CheckBoxPreference
        android:key="checkbox" />                  
</PreferenceScreen>

我的按钮都调用相同的函数,该函数调用了启动PreferenceActivity的意图。

我想要做的是用每个按钮调用相同的模型,但保存每个按钮的复选框的值。目前,每次单击按钮时,它都会启动活动,但是,例如,我的按钮1的值将在我的按钮5的值中找到。

我应该使用SharedPreferences还是别的什么?

我知道这是可能的,但由于我仍然不熟悉许多概念,我只是找不到它。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你必须告诉PreferenceActivity按哪个按钮。您可以通过在启动活动时将按钮ID设置为参数来实现此目的。

/*
 * This is the common method used by all the buttons after the click 
 * was done in order to start the PreferenceActivity and pass
 * the button id as a parameter
 * @param sender - Button which was pressed and will start the
 * PreferenceActivity
*/
private void startPreferenceActivity(Button sender)
{
    // create the intent
    Intent intent=new Intent(context, PreferenceActivity.class);

    // add button id as a parameter
    intent.putExtra("buttonID", sender.getId());

    // start activity
    startActivity(intent);

    // or you can start it to way for a result 
    // startActivityForResult(intent, 0);
}

现在,在PreferenceActivity中你必须得到你发送的参数:

/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // get the extras where the parametrs are stored
    Bundle bundle = getIntent().getExtras();

    if(bundle.getInt("buttonID") != null)
    {
            // get id as int with default value as 0
            int id= intent.getInt("buttonID", 0);
    }

    if(bundle.getString("buttonID") != null)
    {
            // get id as string with default value as ""
            string id= intent.getString("buttonID", "");
    }

    // other code here ...

}

希望这会对你有所帮助。

答案 1 :(得分:0)

这是您的问题:PreferenceActivity会自动将您的设置保存在应用程序的共享首选项中。对于每个设置,您在preferences.xml中定义一个键。在你的情况下,这是

android:key="checkbox"

因此,当您使用按钮5打开首选项时,SP中的值“复选框”将设置为 true 。再次使用按钮1打开首选项时,PreferencesActivity会查找SP,看到“复选框”是 true ,因此将复选框设置为已选中

为了避免这个问题,就像Adrian所说,你必须将信息传递给你的PreferenceActivity,了解点击的按钮。在PreferenceActivity中,您必须获得对复选框首选项的引用,并将传递的按钮ID添加到密钥中。

Preference checkboxPreference = findPreference("checkbox");
checkboxPreference.setKey(checkboxPreference.getKey() + buttonId);

现在SP中为每个按钮保存了10个唯一命名的布尔值(“checkbox1”,“checkbox2”,..)。

玩得开心