#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()
.
Но лучше использовать аргументы для передачи данных между фрагментами.