倾听偏好变化

时间:2016-01-19 21:02:23

标签: android android-preferences

我正在根据Google tutorial实施偏好设置。但我的事件监听器没有收到任何变化。我意识到这是因为我在onResume取消注册了听众,就像谷歌推荐的那样。我错过了什么或谷歌建议错了吗?

  

为了在活动中进行适当的生命周期管理,我们建议您   注册并取消注册您的   在此期间的SharedPreferences.OnSharedPreferenceChangeListener   onResume()和onPause()回调分别为:

public class MyActivity extends AppCompatActivity implements
    NavigationView.OnNavigationItemSelectedListener,
    SharedPreferences.OnSharedPreferenceChangeListener {

public boolean onOptionsItemSelected(MenuItem item) {
        case R.id.action_level: {
            Intent intent = new Intent();
            intent.setClass(this, GamePreferenceActivity.class);
            startActivity(intent);
            return true;
 ...

protected void onPause() {
    Log.d(logTag, "onPause()");
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    sharedPref.unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

protected void onResume() {
    Log.d(logTag, "onResume()");
    super.onResume();
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    sharedPref.registerOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals(MyPreferenceActivity.KEY_COMPLEXITY)) {
        String value = sharedPreferences.getString(key, "EASY");
        logic.setLevel(Level.valueOf(value));
        restartGame(null);
    }
}

我的活动启动了偏好活动的意图。

public class GamePreferenceActivity extends Activity {
    public static final String KEY_COMPLEXITY = "prefGameComplexity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new GamePreferenceFragment())
                .commit();

        PreferenceManager.setDefaultValues(this, R.xml.game_prefs, false);
    }
}

public class GamePreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.game_prefs);
    }
}

2 个答案:

答案 0 :(得分:2)

您需要致电commit()apply()以保存偏好设置的更改。

示例:

// Access the default SharedPreferences
    SharedPreferences preferences = 
    PreferenceManager.getDefaultSharedPreferences(this);
    // The SharedPreferences editor - must use commit() to submit changes
    SharedPreferences.Editor editor = preferences.edit();

    // Edit the saved preferences
    editor.putString("UserName", "JaneDoe");
    editor.putInt("UserAge", 22);
    editor.commit(); //or editor.apply() -- Read below for difference between these two

commit()apply()之间的差异:

在2.3中添加了

apply(),它提交时没有返回表示成功或失败的布尔值。

如果保存有效,

commit()将返回true,否则返回false。

添加了

apply(),因为Android开发团队注意到几乎没有人注意到返回值,所以apply更快,因为它是异步的。

答案 1 :(得分:0)

这是我注册和取消注册听众的方式:

@Override
public void onResume() {
super.onResume();
// Register the listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
                    .registerOnSharedPreferenceChangeListener(this);
        }

@Override
public void onPause() {
super.onPause();   
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
                        .unregisterOnSharedPreferenceChangeListener(this);
            }

告诉我们你的onSharedPreferenceChanged,也许你在那里犯了错误。