Я искал некоторую помощь с SharedPreferences (SP), но чувствую себя все более и более запутанным. Насколько я понимаю, по умолчанию использование имени пакета в объявлении SP сделает настройки доступными для всех действий в моем приложении.
После поиска переполнения стека я заметил использование имен файлов (у меня естьОбыскивал в папках моего приложения какие-либо SP-файлы (но безрезультатно), где они будут храниться? Я также заметил использование так называемых «одноэлементных методов».
Источником моей проблемы является следующий код -
MainActivity -
public class MainActivity extends AppCompatActivity {
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Let's Play Darts");
sharedPreferences = getApplicationContext().getSharedPreferences("com.app.letsplaydarts", Context.MODE_PRIVATE);
editor = sharedPreferences.edit(); // package name used in declaration as I was taught
editor.putString("p1", null);
editor.putInt("p1Picked", 0);
editor.putString("p2", null);
editor.putInt("p2Picked", 0); // Resetting values when app opens
editor.putString("p3", null);
editor.putInt("p3Picked", 0);
editor.putString("p4", null);
editor.putInt("p4Picked", 0);
editor.commit();
}
}
нажатие накнопка открывается - действие GameSetup - редактор, неиспользуемый в этом упражнении
public class GameSetup extends AppCompatActivity {
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_setup);
sharedPreferences = getApplicationContext().getSharedPreferences("com.app.letsplaydarts", Context.MODE_PRIVATE);
editor = sharedPreferences.edit(); // declared in same manner
if (sharedPreferences.getInt("p1Picked", 0) == 1) {
player1TextView.setText(sharedPreferences.getString("p1", ""));
if (sharedPreferences.getInt("p2Picked", 0) == 1) {
player2TextView.setText(sharedPreferences.getString("p2", ""));
if (sharedPreferences.getInt("p3Picked", 0) == 1) {
player3TextView.setText(sharedPreferences.getString("p3", ""));
if (sharedPreferences.getInt("p4Picked", 0) == 1) {
player4TextView.setText(sharedPreferences.getString("p4", ""));
}
}
} // sets textviews dependant on SP values
}
Log.d("testing", "p1Picked " + sharedPreferences.getInt("p1Picked", 0));
Log.d("testing", "p1" + sharedPreferences.getString("p1", ""));
Log.d("testing", "p2Picked " + sharedPreferences.getInt("p2Picked", 0));
Log.d("testing", "p2" + sharedPreferences.getString("p2", ""));
Log.d("testing", "p3Picked " + sharedPreferences.getInt("p3Picked", 0));
Log.d("testing", "p3" + sharedPreferences.getString("p3", ""));
Log.d("testing", "p4Picked " + sharedPreferences.getInt("p4Picked", 0));
Log.d("testing", "p4" + sharedPreferences.getString("p4", ""));
} // on first run through, all logs are defaults reset in MainActivity
Нажатие кнопки в действии GameSetup вызывает класс .java, чтобы открыть диалоговое окно оповещения со списком, чтобы выбрать из списка игроков, извлеченных изParseServer -
public void selectionDialog (View view) {
CustomMethods.playerSelection(this);
}
вызывает -
public class CustomMethods {
static public String playerSelection (final Context context) {
final SharedPreferences sharedPreferences = context.getApplicationContext().getSharedPreferences("com.apps.letsplaydarts", Context.MODE_PRIVATE);
final SharedPreferences.Editor editor = sharedPreferences.edit(); // same declaration again - declared final for access in listeners
// alert dialog code removed
playerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
Intent intent = new Intent(context, AddPlayer.class);
intent.putExtra("callingIntent", "Setup");
context.startActivity(intent);
} else {
playerToReturn[0] = playerList.get(position);
if (sharedPreferences.getInt("p1Picked", 0) == 0) {
editor.putInt("p1Picked", 1);
editor.putString("p1", playerToReturn[0]);
} else {
if (sharedPreferences.getInt("p2Picked", 0) == 0) {
editor.putInt("p2Picked", 1);
editor.putString("p2", playerToReturn[0]);
} else {
if (sharedPreferences.getInt("p3Picked", 0) == 0) {
editor.putInt("p3Picked", 1);
editor.putString("p3", playerToReturn[0]);
} else {
if (sharedPreferences.getInt("p4Picked", 0) == 0) {
editor.putInt("p4Picked", 1);
editor.putString("p4", playerToReturn[0]);
}
}
}
}
editor.apply();
Log.d("testing", "p1Picked " + sharedPreferences.getInt("p1Picked", 0));
Log.d("testing", "p1" + sharedPreferences.getString("p1", ""));
Log.d("testing", "p2Picked " + sharedPreferences.getInt("p2Picked", 0));
Log.d("testing", "p2" + sharedPreferences.getString("p2", ""));
Log.d("testing", "p3Picked " + sharedPreferences.getInt("p3Picked", 0));
Log.d("testing", "p3" + sharedPreferences.getString("p3", ""));
Log.d("testing", "p4Picked " + sharedPreferences.getInt("p4Picked", 0));
Log.d("testing", "p4" + sharedPreferences.getString("p4", ""));
Intent intent = new Intent(context, GameSetup.class);
intent.putExtra("callingIntent", "Select");
intent.putExtra("playerReturned", playerToReturn[0]);
context.startActivity(intent);
}
Log.i("Position Selected", Integer.toString(position));
}
});
Теперь ... само кодирование функционирует, соответствующие SP устанавливаются перед выходом из диалогового окна с предупреждением, но при возврате к действию GameSetup ижурналы проверяются снова, отображаются только те же значения по умолчанию, которые записываются в журналы перед выходом из GameSetup, а не те, которые были сохранены при запуске диалогового окна с предупреждением.
Полностью ли я неправильно понимаю, как работает SP? Или это Context.MODE_PRIVATE
, который я не видел в других примерах, который нужно изменить. Я потратил много времени на изучение этого, не понимая при этом функциональности SP, но из того, что меня научили, это должно сработать.
Я очень признателен за помощь в этом вопросе. Спасибо.
ПОСЛЕ РЕДАКТИРОВАНИЯ - могут ли быть контексты, создающие проблему, когда я запускаю код в отдельном классе .java? будет ли решена моя проблема, запустив код диалога с предупреждением прямо из действия GameSetup? Я рассуждаю об использовании класса .java для возможности вызова из других действий.
По запросу Журналы - загрузка GameSetup из MainActivity
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p1Picked 0
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p1
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p2Picked 0
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p2
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p3Picked 0
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p3
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p4Picked 0
11-01 19:55:44.449 22498-22498/com.app.letsplaydarts D/testing: p4
после выбора игрока в диалоговом окне предупреждения класса .java-
these are NOT reset by the onCreate of MainActivity
11-01 19:55:50.168 22498-22498/com.app.letsplaydarts D/testing: p1Picked 1
11-01 19:55:50.168 22498-22498/com.app.letsplaydarts D/testing: p1[Les]
11-01 19:55:50.168 22498-22498/com.app.letsplaydarts D/testing: p2Picked 1
11-01 19:55:50.169 22498-22498/com.app.letsplaydarts D/testing: p2[Iain]
11-01 19:55:50.169 22498-22498/com.app.letsplaydarts D/testing: p3Picked 1
11-01 19:55:50.169 22498-22498/com.app.letsplaydarts D/testing: p3[Les]
11-01 19:55:50.169 22498-22498/com.app.letsplaydarts D/testing: p4Picked 1
11-01 19:55:50.169 22498-22498/com.app.letsplaydarts D/testing: p4[Les]
после возврата в GameSetup из диалогового окна предупреждения класса .java
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p1Picked 0
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p1
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p2Picked 0
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p2
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p3Picked 0
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p3
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p4Picked 0
11-01 19:55:50.212 22498-22498/com.app.letsplaydarts D/testing: p4
решено - из-за опечатки в одном из моих объявлений SP. Я довольно новичок в сообществе, поэтому, пожалуйста, посоветуйте, следует ли мне удалить этот вопрос или оставить его на тот случай, если у кого-то еще возникнет проблема. Для справки, я узнал справедливо из этой публикацииСпасибо.