0

「設定」ページをクリックすると、CheckBoxPreference はこの段階でどのようにしたいかを正確に示しますが、それを選択しても状態は変わりません (つまり、未チェックからチェック済みに変わりません)。

false(デフォルト)の値を保持しているようで、値が渡されたときに false で onPreferenceChanged を実行しているようです。変更された設定の値に依存する onPreferenceChangedListener 内でコードを実行しています。現状では、ここでの好みは 1 つだけです。

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");

編集 私が気づいたことの1つは、設定アクティビティを適切に処理していないことです...このコードを検討してください。常に、設定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 に答える