从SharedPreferences获取Value的TextView没有显示任何内容,但应该有默认值

时间:2016-09-08 09:40:55

标签: android android-fragments sharedpreferences

我遇到SharedPreferences的问题,这有点奇怪。

我有ActivityFragment中拥有ViewPager。该片段显示图标和文本。您可以从其他活动更改此片段中显示的图标(复选标记或交叉,检查标记为默认值)和文本。然后将数据转移到片段容器活动中。

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

所以我尝试用SharedPreferences实现这一点,但是当我尝试它时,我的片段显示没有文本和假图标,虽然我设置了默认值,图标始终是十字架,无论是什么它是在之前,但默认图标应该是复选标记。

我使用用户在之前的活动中输入的数据创建了片段的onCreateView()中的值。

存储

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();

            Bundle bundle = getArguments();

            String city = bundle.getString("city");
            String country = bundle.getString("country");
            int ok = bundle.getInt("ok");

            TextView cityText = (TextView) view.findViewById(R.id.city_name);
            TextView countryText = (TextView) view.findViewById(R.id.country_name);
            ImageView shownIcon = (ImageView) view.findViewById(R.id.ok_bad_icon);

            cityText.setText(city);
            countryText.setText(country);

            if(ok == 1){
             shownIcon.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.checkmark_icon, null));
            }else{
                shownIcon.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.bad_icon, null));
            }

            editor.putString("city", city);
            editor.putString("country", country);
            editor.putInt("okBad", ok);
            editor.putString("saved", "Yes");

            editor.apply();

然后,我获取了包含片段的活动的onCreate()中的值:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
String storedSave = sharedPref.getString("saved", "no");

    if (storedSave.equalsIgnoreCase("yes")){

    String storedCity = sharedPref.getString("city", "berlin");
    String storedCountry = sharedPref.getString("country", "germany");
    int storedOkBad = sharedPref.getInt("okBad", 1);

        Bundle extras = new Bundle();

        StatusFragment savedFragment = new StatusFragment();

        extras.putString("city", storedCity);
        extras.putString("country", storedCountry);
        extras.putInt("okBad", storedOkBad);

        savedFragment.setArguments(extras);

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

我在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 keep getting default value

How to use SharedPreferences in Android to store, fetch and edit values

我还尝试使用Log.w()Toast.makeText()来打印城市的价值,但是没有显示任何内容,就像它被完全跳过一样,但为什么我的Fragment { {1}}然后重启后跳过这个并且没有添加?

在编辑时我是否必须使用Activity,或者我可以使用edit().putString().apply()添加值,即使它已经存在了吗?

很抱歉,如果我这可能是微不足道的,但我没有使用过很多碎片,而且我现在第一次使用editor.putString()

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

4 个答案:

答案 0 :(得分:0)

getActivity()片段方法中调用onActivityCreated()。 在onCreateView()中可能会返回null context。请检查并移动onActivityCreated()方法中的代码。

答案 1 :(得分:0)

尝试更改此SharedPreference初始化,并在getActivity()中致电onActivityCreated()

PreferenceManager.getDefaultSharedPreferences(getActivity())

建议您apply()而不是commit()。编辑更改后,请致电:

editor.apply()

答案 2 :(得分:0)

在观察您的代码时,我注意到密钥中存在不匹配。

  

保存在捆绑中时,您使用了密钥 - okBad

    Bundle extras = new Bundle();
    ....
    extras.putInt("okBad", storedOkBad);
  

在片段中检索时你使用了键 - 确定

    Bundle bundle = getArguments();
    ...
    int ok = bundle.getInt("ok");

所以请先纠正它。

答案 3 :(得分:0)

问题现在解决了。我不得不使用getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);,我的一些变量在捆绑和首选项中混淆了。我已经纠正了这个问题,现在工作正常:)感谢您的回答。