У меня есть общие префы, которые будут использоваться в моем приложении, но сейчас только четыре действия.Первое действие - это просмотрщик с флажками, и checked status
сохраняется (в адаптере переработчика) для каждого флажка с использованием класса shared prefs helper
.Затем следующее действие запускается в виде табуляции с фрагментами, содержащими список случайных элементов.
Когда пользователь щелкает любой из этих элементов в second activity's fragment
, запускается третье действие.Здесь я пытаюсь получить значения из общего вспомогательного класса prefs, но он возвращает ноль, такая же ситуация и в fourth activity
.Кроме того, когда я дважды нажимаю на first activity
, он также возвращает ноль.
Я бы опубликовал свой код для всех видов деятельности, но это только усложнило бы вопрос.Вот мой вспомогательный класс:
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);
}
}
Настройки сохраняются в адаптере первого действия, как показано ниже:
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;
В следующем упражнении я могу получить значения общих префов, например:ниже фрагмент:
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);
}
Я использовал общие префы, чтобы установить вывод табуляции во время установки приложения, но после перехода к другим действиям и возврата к этому эти вкладки из префов удаляются, в других случаях моипоследняя вкладка затем содержит представление и данные фрагмента природы из prefs.
В адаптере и двух последних действиях последовательно я получаю ключ, подобный этому, но он возвращает ноль:
prefsHelper = new WalpyPrefsHelper(this);
Log.d(TAG, "Nature Key:\t" + prefsHelper.getKeyNature());
Кроме того, в адаптере значение возвращает нулевое значение и другие последующие действия после второго действия.Это поведение sharedprefs, я где-то неправильно настроил или sharedprefs не может быть передан от действия к фрагменту и контексту адаптера?
Я пробовал .apply() and .commit()
для редактора, но возникает та же самая ситуация.Кто-нибудь понимает почему?Спасибо.