【问题标题】:SharedPreferences Across Multiple Activities Returns NULLSharedPreferences 跨多个活动返回 NULL
【发布时间】:2018-06-13 03:09:32
【问题描述】:

我已共享要在整个应用程序中使用的首选项,但现在只有四个活动。第一个活动是一个带有复选框的回收器视图,并且使用shared prefs helper 类为每个复选框保存checked status(在回收器适配器中)。然后下一个 Activity 以 tablayout 的形式启动,其中的片段包含随机项目列表。

当用户单击second activity's fragment 中的任何这些项目时,将启动第三个活动。在这里,我尝试从共享首选项助手类中检索值,但它返回 null,fourth activity 中的情况也相同。另外,当我按两次first activity 时,它也返回null。

我会发布所有活动的代码,但这只会使问题变得冗长。这是我的助手类:

public class WalpyPrefsHelper {

public Context context;
public SharedPreferences customizePrefs, tabsCountPrefs;
public SharedPreferences.Editor editor, tabsEditor;

public static final String CUSTOMIZE_TABS_PREFS = "customizeTabsPrefs";
public static final String COUNT_TABS_PREFS = "countTabsPrefs";

public static final String KEY_NATURE = "nature";
public static final String KEY_SPACE = "space";
public static final String KEY_SEASONS = "seasons";
public static final String KEY_ART = "art";
public static final String KEY_SCIFI = "sci_fi";
public static final String KEY_MISC = "misc";

public static final String KEY_COUNT = "count_tabs";

public WalpyPrefsHelper(Context context) {
    this.context = context;
    customizePrefs = context.getSharedPreferences(CUSTOMIZE_TABS_PREFS, Context.MODE_PRIVATE);
    editor = customizePrefs.edit();

    tabsCountPrefs = context.getSharedPreferences(COUNT_TABS_PREFS, Context.MODE_PRIVATE);
    tabsEditor = tabsCountPrefs.edit();

}

public void saveNaturePrefs(String s){
    editor.putString(KEY_NATURE, s).apply();
}

public String getKeyNature(){
    return customizePrefs.getString(KEY_NATURE, null);
}

public void removeNaturePrefs(){
    editor.remove(KEY_NATURE).apply();
}

public void saveSpacePrefs(String s){
    editor.putString(KEY_SPACE, s).apply();
}

public String getKeySpace(){
    return customizePrefs.getString(KEY_SPACE, null);
}

public void removeSpacePrefs(){
    editor.remove(KEY_SPACE).apply();
}

public void saveSeasonsPrefs(String s){
    editor.putString(KEY_SEASONS, s).apply();
}

public String getKeySeasons(){
    return customizePrefs.getString(KEY_SEASONS, null);
}

public void removeSeasonPrefs(){
    editor.remove(KEY_SEASONS).apply();
}

public void saveArtPrefs(String s){
    editor.putString(KEY_ART, s).apply();
}

public String getKeyArt(){
    return customizePrefs.getString(KEY_ART, null);
}

public void removeArtPrefs(){
    editor.remove(KEY_ART).apply();
}

public void saveSci_FiPrefs(String s){
    editor.putString(KEY_SCIFI, s).apply();
}

public String getKeyScifi(){
    return customizePrefs.getString(KEY_SCIFI, null);
}

public void removeSci_FiPrefs(){
    editor.remove(KEY_SCIFI).apply();
}

public void saveMiscPrefs(String s){
    editor.putString(KEY_MISC, s).apply();
}

public String getKeyMisc(){
    return customizePrefs.getString(KEY_MISC, null);
}

public void removeMiscPrefs(){
    editor.remove(KEY_MISC).apply();
}

public void removeAllPrefs(){
    editor.remove(KEY_NATURE).apply();
    editor.remove(KEY_SPACE).apply();
    editor.remove(KEY_SEASONS).apply();
    editor.remove(KEY_ART).apply();
    editor.remove(KEY_SCIFI).apply();
    editor.remove(KEY_MISC).apply();
}

public void saveCount(int count) {
    tabsEditor.putInt(KEY_COUNT, count).apply();
}

public int getSaveCount(){
    return tabsCountPrefs.getInt(KEY_COUNT, 0);
}
}

首选项保存在第一个活动回收器适配器中,如下面的 sn-p:

viewholder.customizeSelImg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String nature, space, seasons, art, scifi, misc;
            switch (position) {
                case 0:
                    nature = prefsHelper.getKeyNature();
                    if (viewholder.customiseCheckBox.isChecked()) {
                        viewholder.customiseCheckBox.setChecked(false);
                        viewholder.customiseCheckBox.setVisibility(View.INVISIBLE);
                        if (nature != null) {
                            prefsHelper.removeNaturePrefs(); // infer nullity
                            if (count > 0) {
                                count--;
                                Log.d(TAG, "Count Value:\t" + count);
                            }
                            Log.d(TAG, "Position:\t" + position + " is UNChecked");
                        }
                    } else {
                        viewholder.customiseCheckBox.setChecked(true);
                        viewholder.customiseCheckBox.setVisibility(View.VISIBLE);
                        count ++;
                        Log.d(TAG, "Count Value:\t" + count);
                        prefsHelper.saveNaturePrefs(Constants.NATURE); // save value. Works fine
                        Log.d(TAG, "Position:\t" + position + " is Checked");
                    }
                    break;

在下一个活动中,我可以检索共享首选项值,如下所示 sn-p:

    String space = prefsHelper.getKeySpace();
    String nature = prefsHelper.getKeyNature();
    String seasons = prefsHelper.getKeySeasons();
    String art = prefsHelper.getKeyArt();
    String scifi = prefsHelper.getKeyScifi();
    String misc = prefsHelper.getKeyMisc();

像这样初始化后:prefsHelper = new WalpyPrefsHelper(this); 但在第三和第四个活动中,上面的那些字符串返回空值。

----编辑部分--- 使用首选项的第二个活动:

public void setUpTabs() {

    prefsHelper = new WalpyPrefsHelper(this);
    int count = prefsHelper.getSaveCount();
    Log.d(TAG, "Tabs Count:\t" + count);

    setUpViewPager(viewPager);
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    tabLayout.setupWithViewPager(viewPager);
}

private void setUpViewPager(ViewPager viewPager) {

    space = prefsHelper.getKeySpace();
    nature = prefsHelper.getKeyNature();
    seasons = prefsHelper.getKeySeasons();
    art = prefsHelper.getKeyArt();
    scifi = prefsHelper.getKeyScifi();
    misc = prefsHelper.getKeyMisc();

    pagerAdapter = new TabsPagerAdapter(getSupportFragmentManager(), this);
    pagerAdapter.addTab(new Top30Fragment(), Constants.Top30);

    if (nature != null) {
        pagerAdapter.addTab(new NatureFragment(), Constants.NATURE);
    }

    if(space != null){
        pagerAdapter.addTab(new SpaceFragment(), Constants.SPACE);
    }

    if (seasons != null){
        pagerAdapter.addTab(new SeasonsFragment(), Constants.SEASONS);
    }

    if (art != null){
        pagerAdapter.addTab(new ArtFragment(), Constants.ART);
    }

    if (scifi != null){
        pagerAdapter.addTab(new SciFiFragment(), Constants.SCI_FI);
    }

    if (misc != null){
        pagerAdapter.addTab(new MiscFragment(), Constants.MISC);
    }

    pagerAdapter.addTabAtLastPosition(new PrefsFragment(), Constants.PREFS);

    viewPager.setAdapter(pagerAdapter);
}

我已使用共享首选项在应用安装时设置选项卡布局,但在导航其他活动并返回到此之后,首选项中的那些选项卡被删除,在其他情况下,我的最后一个选项卡然后包含自然片段的视图和数据来自首选项。

在适配器和最后两个活动中,我得到这样的密钥,但它返回 null:

    prefsHelper = new WalpyPrefsHelper(this);
    Log.d(TAG, "Nature Key:\t" + prefsHelper.getKeyNature());

此外,在适配器中,该值返回 null 并且在第二个活动之后的其他后续活动中。这是 sharedprefs 行为吗,我在某处配置错误,或者 sharedprefs 无法从活动传递到片段和适配器上下文?

我已经为编辑器尝试了.apply() and .commit(),但同样的情况发生了。 任何人都明白为什么?谢谢。

【问题讨论】:

    标签: android android-fragments android-activity sharedpreferences android-tablayout


    【解决方案1】:

    我已通过使用 sqlite 来持久化和检索值来解决此问题。

    【讨论】:

      【解决方案2】:

      查看附加的代码流,我找不到任何有问题的部分。虽然每个活动都有一个创建和使用的首选项管理器类实例,但 SharedPrefenrece 对象本身是作为一个对象共享的,所以这不是问题。

      请再次检查偏好值是否在流程中被删除。 此外,如果您在每个活动中附加使用 prefsHelper 的部分,故障排除将很有帮助。

      【讨论】:

      • 抱歉延迟回复。我检查了第二个活动中托管的活动和片段。可以删除首选项的唯一位置是在第一个活动中。第三和第四的其他活动不断返回空值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多