共享首选项未保存

时间:2011-06-20 07:06:15

标签: android sharedpreferences

在我的活动中,我根据存储的偏好更新用户界面。 updateUI的代码如下:

private void updateUI()
{
    //preferences = getSharedPreferences(Select.PREF_FILE_NAME, MODE_PRIVATE);
    preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    toggle = (Button)findViewById(R.id.toggleButton);
    incommingEdit = (Button)findViewById(R.id.IncommingEditButton);
    outgoingEdit = (Button)findViewById(R.id.outgoingEditButton);
    missedEdit = (Button)findViewById(R.id.missedEditButton);
    save = (Button)findViewById(R.id.saveButton);
    cancel = (Button)findViewById(R.id.cancelButton);
    incommingCheck = (CheckBox)findViewById(R.id.incommingCheck);
    outgoingCheck = (CheckBox)findViewById(R.id.outgoingCheck);
    missedCheck = (CheckBox)findViewById(R.id.missedCheck);
    incommingTextView = (TextView) findViewById(R.id.incommingTextView);
    outgoingTextView = (TextView) findViewById(R.id.outgoingTextView);
    missedTextView = (TextView) findViewById(R.id.missedTextView);

    //Disable all the edit buttons until their checkboxes are checked.
    incommingEdit.setEnabled(false);
    outgoingEdit.setEnabled(false);
    missedEdit.setEnabled(false);

    //Display the messages in the text views.
    incommingTextView.setText(preferences.getString("incommingMsgPhone", "Currently there are no messages saved."));
    outgoingTextView.setText(preferences.getString("outgoingMsgPhone", "Currently there are no messages saved."));
    missedTextView.setText(preferences.getString("missedMsgPhone", "Currently there are no messages saved."));

    //Check the check boxes.
    if(preferences.getInt("incommingPhone", 0) == Calls.INCOMING_TYPE)
    {
        incommingCheck.setChecked(true);
        incommingEdit.setEnabled(true);
    }

    if(preferences.getInt("outgoingPhone", 0) == Calls.OUTGOING_TYPE)
    {
        outgoingCheck.setChecked(true);
        outgoingEdit.setEnabled(true);
    }

    if(preferences.getInt("missedPhone", 0) == Calls.MISSED_TYPE)
    {
        missedCheck.setChecked(true);
        missedEdit.setEnabled(true);
    }

    //Check if the application is on or off and set the text of the button.
    //preferences = getSharedPreferences(Select.PREF_FILE_NAME, MODE_PRIVATE);
    boolean on = preferences.getBoolean("isOn", false);
    if(!on)
        toggle.setText("Turn On");
    else
        toggle.setText("Turn off");
}

以下是我保存所有这些偏好的方法:

save.setOnClickListener(new OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // TODO Auto-generated method stub
            //Save all in the preference file and exit.
            //preferences = getSharedPreferences(Select.PREF_FILE_NAME, MODE_PRIVATE);
            Editor editor = preferences.edit();
            editor.putInt("incommingPhone", incomming);
            editor.putInt("outgoingPhone", outgoing);
            editor.putInt("missedPhone", missed);

            editor.putString("incommingMsgPhone", incommingMsg);
            editor.putString("outgoingMsgPhone", outgoingMsg);
            editor.putString("missedMsgPhone", missedMsg);

            editor.commit();
            finish();
        }
    });

我的UI在第二次运行我的应用程序时正确更新,但在第三次或第四次我获得默认首选项值。我甚至尝试使用getdefaultpreferences而不是getsharedpreferences,但没有运气。

5 个答案:

答案 0 :(得分:5)

我遇到了与getStringSet类似的问题,该文档帮助了

  

请注意,您不得修改此调用返回的set实例。   如果您这样做,则无法保证存储数据的一致性   你根本无法修改实例。

答案 1 :(得分:3)

在使用之前尝试清除编辑器。换句话说:

Editor editor = preferences.edit();
editor.clear();
editor.putInt("incommingPhone", incomming);
editor.commit();

我和你的问题完全相同,这对我有用。对于我的整个代码示例,请参阅this post on my blog

答案 2 :(得分:2)

我遇到了类似的问题 - 我保留了我的String变量,但没有别的。 作为一个穷人的解决方法,我将一切都保存为字符串。

答案 3 :(得分:0)

试试这个..

 preferences = activity.getSharedPreferences("Share", Context.MODE_PRIVATE);`

答案 4 :(得分:-1)

这是例子:

public void saveFavName(String what)
        {


             myPrefs= getSharedPreferences("myPrefs", MODE_PRIVATE);
             SharedPreferences.Editor es = myPrefs.edit();
             es.putString( "value", what); // add or overwrite someValue
                 es.commit(); // this saves to disk and notifies observers
        }