【问题标题】:Android SharedPreferences between Activities only loads defValueActivity 之间的 Android SharedPreferences 只加载 defValue
【发布时间】:2019-12-18 17:57:00
【问题描述】:

我有一个简单的问题。我找不到在我的活动之间使用 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);
    }
}

MainActivity:

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

    }

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

【问题讨论】:

  • 在设置活动中你有SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this),但在另一个活动中SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);。那当然是错误的。您应该使用相同的。
  • 在设置活动中你不必自救。

标签: java android android-activity sharedpreferences


【解决方案1】:

您正试图从 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();

【讨论】:

  • 谢谢!我怎么知道我必须传递给编辑器的值? SettingsActivity 中的 2 行是读取我所知道的当前状态的唯一方法。
  • 这些值是您要保存在共享首选项中的值。也请给出一个接受的答案并投票。编码愉快!
  • 我知道。我的问题是我不知道如何从复选框中读取当前值。我知道的唯一方法是阅读 SettingsActivity 写入 SharedPreferences 的内容。
  • 要从复选框中获取当前值,您需要setOnCheckChangedListener()。这个link 可能会对你有所帮助
  • 我试过了,结果证明这不起作用,因为它不是一个普通的复选框,它是一个 checkBoxPreference 并且没有 onCheckChangedListener。我尝试的每种方法都涉及preference.find,已被贬低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多