跨多个活动的 SharedPreferences Returns NULL

SharedPreferences Across Multiple Activities Returns NULL

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

当用户单击 second activity's fragment 中的任何一项时,将启动第三个 activity。在这里,我尝试从共享首选项助手 class 中检索值,但它 return 为空,fourth activity 中的情况也相同。另外,当我向后按两次 first activity 时,它也 returns null.

我会 post 我的所有活动代码,但这只会让问题变得冗长。这是我的帮手 class:

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

首选项保存在第一个 activity 回收器适配器中,如下片段:

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;

在下一个 activity 中,我能够像下面的代码片段一样检索共享偏好值:

    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); 但在第三和第四个活动中,那些字符串高于 return 空值。

----编辑部分--- 第二个 Activity 使用首选项的地方:

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

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

的自然片段

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

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

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

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

查看附件的代码流程,我找不到任何有问题的部分。尽管每个 activity 都创建并使用了首选项管理器 class 实例,但 SharedPrefenrece 对象本身作为一个对象共享,因此这不是问题。

请再次检查流程中是否删除了首选项值。 此外,如果您在每个 activity 中附加使用 prefsHelper 的部分,将有助于解决问题。

我已经通过使用 sqlite 保存和检索值解决了这个问题。