【问题标题】:Can't get values from SharedPreferences, logcat shows nothing [duplicate]无法从 SharedPreferences 获取值,logcat 什么也不显示 [重复]
【发布时间】:2016-09-01 11:09:35
【问题描述】:

我在 SharedPreferences 上遇到了一个奇怪的问题。

我有一个在 ViewPager 中保存 Fragment 的 Activity。该片段显示一个图标和文本。您可以从另一个活动更改此片段中显示的图标(复选标记或叉号,复选标记是默认值)和文本。

现在我想保存文本和选择的图标,因此片段会显示相同的文本和图标,即使您关闭应用程序并稍后重新启动它也是如此。

所以我尝试使用 SharedPreferences 来实现这一点,但是当我尝试它时,我的片段没有显示任何文本,尽管我设置了默认值并且图标始终是十字,无论它之前是什么,尽管默认图标应该做复选标记。

当我使用用户之前在活动中输入的数据创建片段时,我将值保存在我的片段的onActivityCreated() 中。

保存:

SharedPreferences sharedPref = getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();

//Here I am getting the values I want to save from a bundle, city and country...

editor.putString("savedCity", city);
editor.putString("savedCountry", country);
editor.putString("fragmentSaved", "yes");

editor.apply(); 

然后,我在我的 Activity 的 onCreate() 中获得了包含 Fragment 的值:

    SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();

//adding fragment that was created with user input

String ifAdded = sharedPref.getString("addedFragment", "no");

    if(ifAdded.equalsIgnoreCase("yes")){
        Bundle extras = getIntent().getExtras();

        StatusFragment newFragment = new StatusFragment();
        newFragment.setArguments(extras);

        mSectionsPagerAdapter.addFragment(newFragment, extras.getString("city"));

        editor.putString("addedFragment", "no");

        editor.apply();
    }

    //Adding a saved fragment after restart

    String storedSave = sharedPref.getString("fragmentSaved", "no");

    if (storedSave.equalsIgnoreCase("yes")){
        String storedCity = sharedPref.getString("savedCity", "somecity");
        String storedCountry = sharedPref.getString("savedCountry", "somecountry");

        Bundle saves = new Bundle();

        StatusFragment savedFragment = new StatusFragment();

        saves.putString("city", storedCity);
        saves.putString("country", storedCity);

        savedFragment.setArguments(saves);

        mSectionsPagerAdapter.addFragment(savedFragment, saves.getString("city"));
    }

在创建片段数据的活动中,我有这个:

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPref.edit();

                    editor.putString("addedFragment", "yes");

                    editor.apply();

                    fragmentHolder.putExtras(bundle);
                    startActivity(fragmentHolder);

bundle 具有用户输入的值,fragmentHolder 是保存片段的活动。

我在 stackoverflow 上搜索了不同问题的答案,但没有一个对我有用,例如:

Cannot get value from sharedpreferences

Shared Preferences get lost after shutting down device or killing the app

Shared Preferences reset data when app is force closed or device is restarted

SharedPreferences return only default value

SharedPreferences return only default value

Shared preference always taking default value

SharedPreferences keep getting default value

很抱歉,这可能是一些微不足道的事情,但我使用 Fragments 的次数不多,我现在是第一次使用 SharedPreferences。

我会很感激每一个有用的答案。

【问题讨论】:

  • 您在哪里检索 sharedpreference 值???我看不到任何代码
  • 这个条件应该做什么? if(getResources().getString(R.string.pref_fragment_saved).equals("Yes")){ 你知道它将始终是 truefalse 基于 R.string.pref_fragment_saved/values/strings.xml 的值,在运行时不可更改。
  • 我们如何在您的代码中访问像这样的共享首选项?SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
  • 我认为我知道有两种方法可以让共享偏好访问1.PreferenceManager.getDefaultSharedPreferences(this); 2.context.getSharedPrefernces(PREF_NAME,MODE)
  • @Anil 了解如何在android dev docs 中查找内容,非常方便。

标签: android android-fragments sharedpreferences


【解决方案1】:

问题现在解决了。我不得不使用getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE); 并且我在捆绑包和偏好中的一些变量混淆了。我纠正了这个问题,现在它可以正常工作了:)感谢您的回答。

【讨论】:

    【解决方案2】:

    您正在混淆存储在 SharedPreference 和应用程序资源 (strings.xml) 中的内容

    editor.putString(getString(R.string.pref_fragment_saved), "Yes");

    这一行将字符串保存在您的首选 XML 中,但随后您尝试将其读取为

    getResources().getString(R.string.pref_fragment_saved).equals("Yes")

    实际上只是从您的strings.xml 读取值R.string.pref_fragment_save

    阅读您保存的内容的正确方法是

    getActivity().getPreferences(Context.MODE_PRIVATE).getString(getResources().getString(R.string.pref_fragment_saved), "defaultValue")

    或者更干净一点:

    SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE);
    String key_frag_saved = getResources().getString(R.string.pref_fragment_saved);
    
    String storedString = prefs.getString(key_frag_saved, "defValue");
    
    if ( storedString.equalsIgnoreCase("yes") ) {...}
    

    与从 SharedPreference 对象实例中读取其他已保存值的方式相同。

    【讨论】:

    • 好像又出了点问题:/ 我得到一个只有默认值的片段。我用我的新代码更新了我的问题。
    • @boehmP 如果我没看错,您是在读取 Activity 的 onCreate() 中的值,该 Activity 包含保存信息的片段?您是否重新启动活动以查看信息是否已加载?你确定onCreate 又被叫到了吗?添加用于加载和保存的 Log.i 消息并检查其执行顺序。
    • 当我添加片段时,我得到以下日志输出:I/Loading:已加载片段,I/Saving:已保存片段,I/Saving:已保存片段。它出于某种原因将其保存了两次,当我关闭应用程序并重新启动它时,它具有相同的输出,但我没有文本和十字图标,尽管我有默认值。我完全不知道为什么会跳过所有内容?
    【解决方案3】:

    你想用这个

    SharedPreferences sharedPref = ...;
    extras.putString("city", sharedPref.getString(getResources().getString(R.string.pref_saved_city), ""));
    

    在您的 onCreate 方法中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多