首页 > 解决方案 > Activity 之间的 Android SharedPreferences 只加载 defValue

问题描述

我有一个简单的问题。我找不到在我的活动之间使用 sharedPreferences 的方法。其中一个是 Settingsactivity,另一个是我的 MainActivity。我想将 SettingsActivity 中的变量(show_idle_dialog 和 selected_currency)保存到 sharedPreferences 并将其加载到 MainActivity。使用我当前的代码,MainActivity 总是加载 defValue。

设置活动:

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

public class SettingsActivity extends AppCompatActivity {

    public static final String KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG = "check_box_show_idle_dialog";
    public static final String KEY_PREF_CURRENCY_DROPDOWN = "currency_dropdown";

    Boolean show_idle_dialog;
    String selected_currency;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

        show_idle_dialog = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, true);
        selected_currency = sharedPreferences.getString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, "currency_eur");

        Log.i("abc", "put " + show_idle_dialog);
        Log.i("abc", "put " + selected_currency);
    }
}

主要活动:

public class MainActivity extends AppCompatActivity {

    public static final String SHARED_PREFS = "sharedPrefs";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        PreferenceManager.setDefaultValues(this, R.xml.root_preferences, false);
        
       }
       
       @Override
    public void onResume(){
        loadData();
        super.onResume();
    }
    
    public void loadData(){

        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);

        show_idle_dialog  = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, false);
        selected_currency = sharedPreferences.getString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, "currency_eur");

        Log.i("abc", "got " + show_idle_dialog);
        Log.i("abc", "got " + selected_currency);

    }

如果有人知道我做错了什么,我会很高兴。

标签: javaandroidandroid-activitysharedpreferences

解决方案


您正在尝试从 SettingsActivity 中的共享首选项中获取价值。

要在共享偏好中节省价值,您可以执行以下操作:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);

     // Writing data to SharedPreferences
     Editor editor = settings.edit();
     editor.putString("key", "some value");
     editor.commit();

所以你需要在 SettingsActivity 中做的是:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

     // Writing data to SharedPreferences
     Editor editor = sharedPreferences .edit();
     editor.putString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, <your-string-value>);
     editor.putBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, <your-boolean-value>)
     editor.commit();

推荐阅读