0

当我单击“设置”页面时,我的 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;
        }

    });
}
}
4

3 回答 3

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”。

于 2012-10-04T11:53:34.833 回答
0

onResume() 从方法中的共享首选项更新值

于 2012-10-04T11:28:34.930 回答
0
SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(PrefsActivity.this);
boolean isReg = prefs.getBoolean("isReg", false);

希望试试这个它会帮助你

于 2012-10-04T11:34:09.167 回答