Можно ли программно взаимодействовать с одной и той же парой значений Preferences из разных Activity?
Это мой первый опыт программирования на java, и под Android в целом. И я пишу интерфейсную игру наподобие симулятора бомжа. К проблеме могут иметь отношение 2 activity. В игре есть достижения. После каждого игрового действия выполняется проверка на наличие показателей для достижения. Ниже код activity с достижениями. На всякий случай я продублировал это еще и в onResume() методе. Для краткости, код других достижений опущу, он аналогичный, только условия в if другие.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_achievements);
acveteranisreached = findViewById(R.id.acveteranisreached);
Pref = getPreferences(MODE_PRIVATE);
veteran = Pref.getBoolean("veteran", false);
if (veteran) {
acveteranisreached.setText(R.string.achreached);
}
}
А здесь код из главной activity. Эта функция вызывается после каждого игрового действия.
public void checkgiveachievements() {
if (battle == 10 && !veteran) {
Pref = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor pr = Pref.edit();
pr.putBoolean("veteran", true);
pr.apply();
showDialog(DIALOG_ACH_VETERAN);
}
}
Данная функция вызывается тоже после каждого игрового действия. но до предыдущей. По задумке она должна контролировать такой момент, чтобы игроку одно и то же достижение не выдавалось, если была начата новая игра, поскольку для их получения требуется и так очень много сделать.
public void checkgetachievements() {
Pref = getPreferences(MODE_PRIVATE);
veteran = Pref.getBoolean("veteran", false);
}
При тестировании механизма достижений была обнаружена проблема. что достижения не регистрируются. Диалоговое окно с ним появляется, в обработчике нажатия на ОК стоит null. Если после его закрытия этой кнопкой выйти на экран меню посредством нажатия системной кнопки назад, и перейти с него на activity с достижениями, то там будет значение по умолчанию, а не то, условие для которого, казалось бы, должно быть выполнено, ведь был вызван метод pr.putBoolean("veteran", true);, и теперь при выполнении этого кода:
veteran = Pref.getBoolean("veteran", false);
if (veteran) {
acveteranisreached.setText(R.string.achreached);
}
условие должно быть истинным. Но оно не истинное. Почему?