Переключение фрагментов внутри вкладки
Я создаю приложение, которое использует ActionBarSherlock. Приложение состоит из трех вкладок, и на каждой из них последовательно отображаются несколько экранов на основе пользовательского ввода. Я могу переключать фрагменты между вкладками, но переключение фрагментовwithin Вкладки дает проблемы. Я пробовал это так:
В основном классе:
<code>SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment); transaction.addToBackStack(null); transaction.commit(); </code>
этоdoes замените первый фрагмент на второй, но при смене вкладок второй фрагмент все еще виден, показывая содержимое новой вкладки поверх содержимого старой вкладки. Я думаю, что как-то мне нужно отсоединить второй фрагмент вonTabUnselected
, но я понятия не имею, как получить ссылку на этот фрагмент.
Кто-нибудь может мне с этим помочь?
Для наглядности некоторые значимые занятия:
Мой основной класс:
<code>public class TreinVerkeer extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupTabs(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } private void setupTabs(Bundle savedInstanceState) { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class)); actionBar.addTab(tab); if (savedInstanceState != null) { actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } } </code>
TabListener (от& quot; Добавление вкладок навигации & quot; на сайте разработчика Android с некоторыми незначительными изменениями):
<code>public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private SherlockFragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; /** * Constructor used each time a new tab is created. * * @param activity * The host Activity, used to instantiate the fragment * @param tag * The identifier tag for the fragment * @param clz * The fragment's Class, used to instantiate the fragment */ public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } /* The following are each of the ActionBar.TabListener callbacks */ public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); // Check if the fragment is already initialized if (mFragment == null && preInitializedFragment == null) { // If not, instantiate and add it to the activity mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else if (mFragment != null) { // If it exists, simply attach it in order to show it ft.attach(mFragment); } else if (preInitializedFragment != null) { ft.attach(preInitializedFragment); mFragment = preInitializedFragment; } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { // Detach the fragment, because another one is being attached ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } </code>
А такжеStationsFragment
(RouteFragment
а такжеDelaysFragment
одинаковы, только с разным текстом)
<code>public class StationsFragment extends SherlockFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.stationsfragment, container, false); } } </code>