Я использовал гибридный подход для фрагментов, содержащих представление списка. Кажется, это исполнено, так как я не заменяю текущий фрагмент, а добавляю новый фрагмент и скрываю текущий. У меня есть следующий метод в деятельности, которая хозяйничает мои фрагменты:
public void addFragment(Fragment currentFragment, Fragment targetFragment, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(0,0,0,0);
transaction.hide(currentFragment);
// use a fragment tag, so that later on we can find the currently displayed fragment
transaction.add(R.id.frame_layout, targetFragment, tag)
.addToBackStack(tag)
.commit();
}
Я использую этот метод в моем фрагменте (содержащий в виде списка) всякий раз, когда элемент списка щелкнул/похлопал (и, таким образом, мне нужно, чтобы запустить/дисплей подробност фрагмент):
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
SearchFragment currentFragment = (SearchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]);
DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details");
((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details");
getFragmentTags()
возвращает массив строк, которые я использую в качестве тегов для различных фрагментов при добавлении нового фрагмента (см transaction.add
метода в addFragment
выше способом).
В фрагмент, содержащий представление списка, я делаю это в методе OnPause():
@Override
public void onPause() {
// keep the list view's state in memory ("save" it)
// before adding a new fragment or replacing current fragment with a new one
ListView lv = (ListView) getActivity().findViewById(R.id.listView);
mListViewState = lv.onSaveInstanceState();
super.onPause();
}
Затем в onCreateView фрагмента (на самом деле в методе, который вызывается в onCreateView), я восстановить состояние:
// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
Log.d(TAG, "Restoring the listview's state.");
lv.onRestoreInstanceState(mListViewState);
}
да что кажется хорошей идеей. Попробуй это. Спасибо – pankajagarwal
Я не мог заставить это работать savedInstanceState всегда был нулевым. Я добавляю фрагмент через макет xml. Если бы изменить mCurCheckPosition на статический, то он работает, но чувствует себя взломанным. – scottyab
@scottyab у вашего фрагмента есть id (если нет, он должен). – ania