Понимание SharedPreferences - PullRequest
       2

Понимание SharedPreferences

2 голосов
/ 01 ноября 2019

Я искал некоторую помощь с 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. Я довольно новичок в сообществе, поэтому, пожалуйста, посоветуйте, следует ли мне удалить этот вопрос или оставить его на тот случай, если у кого-то еще возникнет проблема. Для справки, я узнал справедливо из этой публикацииСпасибо.

1 Ответ

5 голосов
/ 01 ноября 2019

Они расположены в /data/data/tld.domain.package/shared_prefs/*.xml и в .onCreate(Bundle savedInstanceState), проверьте savedInstanceState == null

..., чтобы определить, когда запускается Activity - потому что .onCreate(Bundle savedInstanceState) запускается чащечем один раз, который является распространенным источником путаницы. Просто установите точку останова и посмотрите, что он делает, возвращаясь к этому Activity. Документация SharedPreferences и SharedPreferences.Editor объясняет это довольно хорошо - и можно также прослушать изменения в другом месте с помощью: registerOnSharedPreferenceChangeListener().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...