在PreferencesActivity中选中时,CheckBoxPreference不会勾选

时间:2012-10-04 11:25:15

标签: java android checkbox sharedpreferences

当我单击“设置”页面时,我的CheckBoxPreference会在此阶段准确显示我想要的内容,但是当我选择它时,状态不会更改(即从未选中状态更改为已选中)。

似乎保留了false(默认值)的值,并且在传递的值时仍然使用false运行onPreferenceChanged。我在onPreferenceChangedListener中运行代码,该代码依赖于更改的首选项的值。目前我只有一个偏好。

activity_preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceScreen>
        <CheckBoxPreference 
            android:summaryOn="true"
            android:summaryOff="false"
            android:key="isReg"
            android:title="Receive Push Messages"
            android:selectable="true"
            android:enabled="true"
            android:persistent="true" />
    </PreferenceScreen>
</PreferenceScreen>

PrefsActivity.java:

import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;

import com.google.android.gcm.GCMRegistrar;

public class PrefsActivity extends PreferenceActivity{

@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);       
    addPreferencesFromResource(R.xml.activity_preferences);

    Preference isReg = (Preference) findPreference("isReg");
    isReg.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){

        public boolean onPreferenceChange(Preference pref, Object arg1) {
            boolean isReg = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getBoolean("isReg", false);
            if (isReg){
                ServerUtilities.register(getApplicationContext(), GCMRegistrar.getRegistrationId(getApplicationContext()));
            }
            else {
                ServerUtilities.unregister(getApplicationContext(), GCMRegistrar.getRegistrationId(getApplicationContext()));
            }
            return isReg;
        }

    });
}
}

3 个答案:

答案 0 :(得分:2)

您在代码示例中使用了错误的首选项小部件,

Preference isReg = (Preference) findPreference("isReg");

它应该是CheckBoxPreference,如

CheckBoxPreference isReg = (CheckBoxPreference) findPreference("isReg");

修改 有一件事我注意到,你没有正确处理偏好活动...考虑这个代码总是调用首选项的commit方法来保存它!

public class PrefsActivity extends PreferenceActivity implements
                                   OnSharedPreferenceChangeListener{
CheckBoxPreference isReg;
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.activity_preferences);
    PreferenceManager.setDefaultValues(this,R.xml.activity_preferences, false);
    isReg = (CheckBoxPreference)findPreference("isReg");
    if (isReg != null){
            isReg.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
                @Override
                public boolean onPreferenceChange(Preference preference,
                        Object newValue) {
                    boolean blnIsReg = Boolean.getBoolean(newValue.toString());
                    Editor e = _prefs.edit();
                    e.putBoolean("isReg", blnIsReg);
                    e.commit();
                    return true;
                }
            });
        }
    }
}

@Override
public void onStart(){
    super.onStart();
    _prefs = PreferenceManager.getDefaultSharedPreferences(this);
}

实现的侦听器必须采用这种方式,即更改的有效性:

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
     Log.d(TAG, "onSharedPreferenceChanged; key = " + key);
}

通过合并监听器,logcat将显示首选项的密钥确实被更改,即“isReg”。

答案 1 :(得分:0)

更新onResume()中共享偏好设置的值 方法

答案 2 :(得分:0)

SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(PrefsActivity.this);
boolean isReg = prefs.getBoolean("isReg", false);

希望尝试这会帮助你