Не работает sharedpreferences между фрагментами

#android #android-fragments #sharedpreferences

#Android #android-фрагменты #sharedpreferences

Вопрос:

У меня есть два фрагмента. В первом фрагменте я ввожу текст и с помощью SharedPreferences я передаю этот текст во второй фрагмент. Отображается второй фрагмент, но без текста. При отладке я вижу, что на втором фрагменте в методе loadText() null .Но я не знаю, как исправить эту ошибку. UPD: editor.putString("saved_text", savedApiKey); если я ввожу строковое значение (например "hello word" , вместо savedApiKey этого оно работает хорошо. первый фрагмент:

 public class FirstFragment extends Fragment {
    private TextView textInFragment;
    private EditText enteredApiKey;
    private Button button;
    private SharedPreferences sharedPreferences;
    private static final String APP_PREFERENCES = "myPreferences";
    private String savedApiKey;

    public FirstFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment, container, false);

        textInFragment = view.findViewById(R.id.textInFirstFragment);
        enteredApiKey = view.findViewById(R.id.enteredApiKey);
        button = view.findViewById(R.id.button);
        savedApiKey = enteredApiKey.getText().toString();
        saveText(savedApiKey);

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SourceFragment newFragment = new SourceFragment();
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, newFragment).addToBackStack(null).commit();
            }
        });
        return view;
    }
  private void saveText(String savedApiKey) {
        sharedPreferences = getContext().getSharedPreferences(APP_PREFERENCES,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("saved_text", savedApiKey);
        editor.commit();
             }}
  

и второй фрагмент:

 public class SourceFragment extends Fragment  {
    private RecyclerView recyclerView;
    private SharedPreferences sharedPreferences;
    public static final String APP_PREFERENCES = "myPreferences";
    private String API_KEY;

    public SourceFragment() {
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.source_fragment, container, false);
        TextView text = view.findViewById(R.id.text);
        text.setText(loadText());
        return view;
    }

    private String loadText() {
        sharedPreferences =getContext().getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        API_KEY = sharedPreferences.getString("saved_text", null);
        return API_KEY;
    }
}
  

Комментарии:

1. Сначала используйте .apply(), а не .commit() и getActivity() вместо getContext()

2. в этом случае тоже не работает…

Ответ №1:

Используйте пакет. Вот пример:

 Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);
  

Затем в вашем фрагменте извлеките данные (например, в методе onCreate()) с помощью:

 Bundle bundle = this.getArguments();
if (bundle != null) {
    int myInt = bundle.getInt(key, defaultValue);
}
  

и не используйте общие предпочтения, подобные этому.
на самом деле используйте класс с именем SharedPreference и сделайте его одноэлементным и используйте его везде, где захотите, без каких-либо проблем.
пример кода:

 public class NameSP {
       private static NameSP spInstance = null;
       private Stirng Text;
       public static NameSP getSPInstance(){
       if (spInstance == null)
           spInstance = new NameSP();
       return spInstance;
       }
       
       public void saveInfo(){
           SharedPreferences sp = 
                  context.getSharedPreferences("nameSP",Context.MODE_PRIVATE);
           SharedPreferences.Editor editor = sp.edit();
           editor.puStirng("text",yourStirng);
           editor.apply();
       }
       public void getText(){
         return this.Text; 
       }
}
  

в вашем фрагменте :

 NameSP nameSp = NameSP.getInstance();
String Text = nameSP.getText();
  

это всего лишь руководство, вам нужно еще несколько методов для загрузки и очистки и многое другое. просто ищите и продолжайте…

Ответ №2:

Когда я вызываю saveText() метод в onPause() методе, подобном:

 @Override
    public void onPause() {
        super.onPause();
        savedApiKey = enteredApiKey.getText().toString();
        saveText();
    }
  

это работает

Ответ №3:

При вызове в EditText нет текста onCreateView . Вы должны вызывать saveText() после ввода. Например, в кнопке onClickListener() .

Но лучше использовать аргументы для передачи данных между фрагментами.