Проблемът е подчертан по-долу, първата част описва какво работи досега.
Използвам множество фрагменти с една дейност. В горната част на фигурата е показан единичен фрагмент, напр. списък с произволно съдържание. Ако щракна някъде, ще се отвори AboutTheAppFragment
. Когато щракна върху back
, отново се показва ASingleFragment
. Това работи перфектно, но това беше лесната част :)
Ето изрязания код, който използвах, за да отворя новия фрагмент.
AboutTheAppFragment aboutTheAppFragment = new AboutTheAppFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainer.getId(), aboutTheAppFragment, AboutTheAppFragment.class.getName());
fragmentTransaction.addToBackStack(null);
Сега е моят проблем
Вместо ASingleFragment
обичам да показвам TabHostPagerFragment
, който използва TabHost и ViewPager за показване на фрагментите (вижте фигурата по-долу). Да кажем, че имам двата фрагмента TabOneFragment
и TabTwoFragment
, но само един е показан във ViewPager. Това също работи чудесно, мога просто да плъзгам по екрана и той превключва между двата фрагмента на раздела. Ако обаче щракна някъде, за да отворя AboutTheAppFragment
и щракна back
отново, и двата фрагмента TabOneFragment
и TabTwoFragment
не показват нищо. Ако завъртя устройството, то презарежда/възстановява фрагментите отново и всичко работи добре. Така че въпросът ми е как мога да добавя TabOneFragment
и TabTwoFragment
към стека назад, така че да се показват правилно, когато щракна върху бутона back
? Обърнете внимание, че работи като в сценарий 1, когато задам TabOneFragment
като ASingleFragment
, след това щракна някъде и щракна отново. Но не работи, когато използвам TabHostPagerFragment.
Ето някои кодови фрагменти на TabHostPagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the tabs pager fragment in the container
View view = inflater.inflate(R.layout.fragment_tabs_pager, container, false);
mContainer = container;
// Set up the TabHost
mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
mTabHost.setup();
// Set up the ViewPager
mViewPager = (ViewPager) view.findViewById(R.id.pager);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Now initialize the TabsAdapter which will be used to manage the tabs
mTabsAdapter = new TabsAdapter(activity, mTabHost, mViewPager);
// Finally add the tabs to the TabsAdapter: meal plan for today and meal plan for the week
mTabsAdapter.addTab(mTabHost.newTabSpec("TabOne").setIndicator("TabOne", TabOneFragment.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("TabTwo").setIndicator("TabTwo", TabTwoFragment.class, null);
if (savedInstanceState != null) {
// NEVER REACHES THIS CASE
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
Забелязах, че savedInstanceState винаги е null. Някаква идея как мога да поправя това и да съхраня разделите в състояние на запазен екземпляр?
Ще се радвам на всяка помощ.
Най-добри пожелания, Майкъл
РЕДАКТИРАНЕ:
Ето йерархията на извикванията на фрагментите:
09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onPause
09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onStop
09-25 09:19:25.703: V/TabsPagerParentFragment(1820): onDestroyView
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onAttach
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreate: savedInstanceState == null
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onActivityCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewStateRestored
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onStart
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onResume
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onPause
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onStop
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroyView
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroy
09-25 09:19:27.312: V/TabsPagerParentFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onViewCreated
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onActivityCreated
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onViewStateRestored
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onStart
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onResume