Общий набор предпочтений во фрагменте, доступ в основном действии Android

Я установил значение sharedpreference во фрагменте. Но когда я пытаюсь получить доступ к этому значению в основной деятельности, я всегда получаю значение по умолчанию (пожалуйста, скажите мне, почему...

Во фрагменте:

    reader= this.getActivity().getSharedPreferences("pref",0); // this is in onCreate

            //this part within a onClick
    editor = reader.edit();
    editor.putBoolean(Preferences.passwordOn, true); 
    editor.putString(Preferences.password, editTextPassword.getText().toString()); 
    editor.commit();

В основной деятельности:

    boolean passwordOn = reader.getBoolean(Preferences.passwordOn, false);
    if(passwordOn)
    {
        Intent loginIntent=new Intent("com.sdg.etspandroidtracker.LOGIN");
        startActivity(loginIntent);
    }

ОБНОВЛЕНИЕ: мой код слишком грязный и огромный. :( Так что я расскажу, что там происходит.

В основной деятельности сначала я проверяю, установлен ли пароль для приложения. Если это так, я показываю экран входа в систему и завершаю основное действие, как указано выше во второй части кода. В противном случае я просто сохраняю основную деятельность.

В настройках у меня есть включение/выключение пароля. Когда я на переключателе, отображается фрагмент, где вы можете ввести новый пароль и подтверждение пароля. Если все данные верны, пароль и статус пароля (информация, если пароль установлен) сохраняются в общих настройках. Этот код является первой частью кода, которую я привел выше.

Я могу успешно запустить приложение с паролем и установить его. Но когда я снова запускаю приложение, экран входа в систему не отображается. Я отладил и обнаружил, что это связано с тем, что sharedpreference пуст и дает значение по умолчанию «false», хотя я установил пароль в последний раз, когда запускал приложение. Кажется, я не могу получить доступ к общим настройкам, которые я установил во фрагменте, в основном действии? :\


person user2112013    schedule 03.05.2014    source источник


Ответы (3)


Если вы хотите передать сообщение от действия к фрагменту, вы можете использовать EventBus и отправить сообщение, которое можно перехватить. Но если ваш код грязный, это может быть не очень хорошей идеей...

person johanvs    schedule 15.04.2016
comment
EventBus может быть правильным выбором, но я предпочитаю писать интерфейс внутри фрагмента и заставлять прикрепленную активность реализовывать интерфейс - person Nicola Gallazzi; 03.11.2017

Вы должны смотреть когда вызываете свой if-block в MainActivity. Потому что, если вы вызовете свой if-block перед установкой новых значений в fragment, вы получите старые. Можете ли вы предоставить больше кода, например, когда вы вызываете свой if-block и что на самом деле делает фрагмент или когда он создается?

person Vojtěch Pešek    schedule 03.05.2014
comment
Я получил ответ: S очень глупая ошибка. Я использовал два разных ключа, чтобы получить общие предпочтения в двух разных местах. - person user2112013; 03.05.2014
comment
Хорошо :) Вы должны использовать как минимум какой-либо тип шифрования developer.android.com/reference/android/content/ , MODE_PRIVATE, если вы посмотрите здесь, вы также можете найти дополнительную информацию об этом. :) - person Vojtěch Pešek; 03.05.2014

Я тоже застрял в той же проблеме, но решение не такое тривиальное. Я использовал Butterknife для привязки значения ресурса (в данном случае ключ в виде строки).

При вызове с общим предпочтением с использованием строки в другом действии всегда использовалось значение по умолчанию. Непосредственное использование строки заставляет его работать.

person lionelmessi    schedule 03.01.2016