Навигация по фрагментам внутри панели с вкладками

Проблема

Прежде чем описать текущую настройку, я опишу свою проблему. Мне нужно иметь иерархическую навигацию между фрагментами внутри отдельных вкладок. Скажем, я развернулся на уровне вкладки, затем переключаю вкладки, а затем возвращаюсь к первой, оригинальной вкладке, мне нужно, чтобы она была на уровне сверления, а затем появилась возможность вернуться на верхний уровень этого вкладка.

Теперь на мою установку.

У меня есть приложение с одним действием MainActivity . Это действие контролирует мою панель действий с вкладками. Я выполнил множество различных руководств для обработки переключения фрагментов, когда выбрана вкладка, а вот приведенный ниже код, который обращает ваше внимание на методы onTabSelected и onTabUnselected .

MainActivity – прослушиватель табуляции

 public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener { private final Activity mActivity; private final String mTag; private final Class<T> mClass; private final Bundle mArgs; private Fragment mFragment; public MyTabListener(Activity activity, String tag, Class<T> clz) { this(activity, tag, clz, null); } public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) { mActivity = activity; mTag = tag; mClass = clz; mArgs = args; // Check to see if we already have a fragment for this tab, probably // from a previously saved state. If so, deactivate it, because our // initial state is that a tab isn't shown. mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); if (mFragment != null && !mFragment.isDetached()) { FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); ft.detach(mFragment); ft.commit(); } } public void onTabSelected(Tab tab, FragmentTransaction ft) { Log.e("FRAGMENT","Selected Fragment With Tag " + mTag); if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); ft.add(android.R.id.content, mFragment, mTag); } else { ft.attach(mFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); } } 

Когда я нахожусь в Tab1 просматривая Fragment1', when a button is pressed I then show another фрагмент called Fragment2`, для которого мне нужна возможность вернуться. Приведенный ниже код работает, если я просто останусь на этой вкладке, однако, когда вы переходите от вкладки и обратно к ней, все испортится.

MainActivity – отображение второго фрагмента

 Fragment tdFrag = Fragment.instantiate(this, SecondFragment.class.getName()); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(android.R.id.content, tdFrag, "secondfrag"); ft.addToBackStack(null); ft.commit(); 

Мои мысли

Я думаю, что это должно быть так, как я отсоединяю фрагменты и обрабатываю переключение при нажатии новой вкладки. Возможно, мне нужно реализовать какой-то способ хранения каждого отдельного backstack для каждой вкладки и загрузки фрагментов из этого вместо стека системы обратно?

Любая помощь будет отличной. Я попытался объяснить это как можно более тщательно и просто.

Заранее спасибо.

Итак, после нескольких экспериментов я решил реализовать пользовательскую заднюю часть, используя перечисленные типы.

У меня есть два типа перечисляемых типов: ViewType и CurrentTab . Тип CurrentTab сообщает мне, какую вкладку я просматриваю в настоящее время, и ViewType сообщает мне, какой вид просматривается на этих вкладках. У меня есть экземпляр ViewType для каждой вкладки, которую я должен хранить, где я нахожусь в hieerarchy.

Чтобы реализовать backstack, я переопределяю метод, который вызывается при нажатии кнопки «Назад».

 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return super.onKeyDone(keyCode,event); } 

Поэтому, когда он проверяет кнопку «Назад», я помещаю свой код для проверки текущей вкладки и отдельных типов представлений. Таким образом, я знаю, где я, и если я откажусь, я знаю, куда мне нужно идти.

Я надеюсь, что это поможет любым вопросам просто оставить комментарий.