Получение предыдущего состояния фрагмента Android на кнопке "Назад"
В приложении для Android у меня есть несколько фрагментов. В одном из фрагментов (фрагмент A) я переключаюсь между двумя наборами изображений в GridView по нажатию кнопки с помощью логической переменной. Щелчок элемента GridView приводит ко второму фрагменту (фрагмент B). При нажатии кнопки "Назад" на фрагменте B в сетке просмотра внутри фрагмента A загружается набор изображений по умолчанию, а не набор изображений перед переходом к следующему фрагменту фрагмента B.
Пожалуйста, руководство, как я могу восстановить предыдущий набор изображений, а не набор изображений по умолчанию?
В MainActivity я реализовал BackPressed следующим образом:
@Override
public void onBackPressed() {
if (frag instanceof SettingsFragment)
loadGridViewFragment();
else if (frag instanceof SingleDuaViewPagerFragment) {
boolean keyIsFavSel = new SharedPreferencesSupplication().read(SingletonClass.keyIsFavSelected, false);
if (keyIsFavSel)
loadDuasListFragment();
else
loadGridViewFragment();
}
else if (frag instanceof DuasListFragment) {
boolean keyIsFavSel = new SharedPreferencesSupplication().read(SingletonClass.keyIsFavSelected, false);
if (keyIsFavSel)
loadGridViewFragment();
else
loadSingleDuaFragment();
}
else
super.onBackPressed();
}
OnCreate метод GridViewFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// fragment = new GridViewFragment();
context = inflater.getContext();
View view = inflater.inflate(R.layout.fragment_gridview, container, false);
ga = new GridViewAdapter(context);
Btn_lang_Ch = (Button) view.findViewById(R.id.lng_ch);
Btn_Settings = (Button) view.findViewById(R.id.button_settings);
favoriteDuas = (Button) view.findViewById(R.id.btn_favorite_duas);
GridMenu =(GridView) view.findViewById(R.id.gridView1);
float scalefactor = getResources().getDisplayMetrics().density * 150;
@SuppressWarnings("deprecation")
int number = getActivity().getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
GridMenu.setAdapter(ga);
GridMenu.setNumColumns(columns);
setRetainInstance(true);
return view;
}
1 ответ
Ты должен позвонить setRetainInstance(true)
в onCreate
метод фрагмента или сохранить и загрузить правильные значения в onSaveInstanceState
а также onRetainInstanceState
РЕДАКТИРОВАТЬ: Я обычно делаю что-то вроде этого:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
private View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
context = inflater.getContext();
view = inflater.inflate(R.layout.fragment_gridview, container, false);
ga = new GridViewAdapter(context);
Btn_lang_Ch = (Button) view.findViewById(R.id.lng_ch);
Btn_Settings = (Button) view.findViewById(R.id.button_settings);
favoriteDuas = (Button) view.findViewById(R.id.btn_favorite_duas);
GridMenu =(GridView) view.findViewById(R.id.gridView1);
float scalefactor = getResources().getDisplayMetrics().density * 150;
@SuppressWarnings("deprecation")
int number = getActivity().getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
GridMenu.setAdapter(ga);
GridMenu.setNumColumns(columns);
}
else {
// remove view from previously attached ViewGroup
ViewGroup parent = (ViewGroup) view.getParent();
parent.removeView(view);
}
return view;
}