Intereting Posts
Как открыть Настройки Android-телефона нажатием кнопки в нашем приложении для Android Android: углы формы не работают при настройке отдельных углов Android – что такое иерархия представлений? React Native: Как я могу определить, работает ли мой код в симуляторе? Android Navigation Drawer и windowActionBarOverlay = true Как отключить адаптер viewpager при касании определенных видов? Влияние использования Multidex на производительность приложения, стабильность, совместимость …? Как я могу изменить продолжительность анимации для Android AnimationDrawable «на лету»? IBeacons – Компания (Estimote, Gimbal и т. Д.) SDKs против библиотеки Android / iOS Android Studio: обнаружен незарегистрированный корень VCS Растянуть изображение в ImageView ActionBarsherlock android.R.id.home <API 11 Как запустить несколько видеороликов с различными видеообъявлениями в одном из видов деятельности в Android 2.2? Сообщение об ошибке эмулятора Android: «PANIC: Отсутствует программа для эмулятора эмулятора для« x86 »CPUS». Как сделать значок приложения на Android?

Переключение фрагментов внутри вкладки

Я создаю приложение, которое использует ActionBarSherlock. Приложение состоит из трех вкладок, и в каждом из них несколько экранов отображаются последовательно на основе пользовательского ввода. Я могу переключать фрагменты между вкладками, но переключение фрагментов в вкладках дает проблему. Я пробовал это так:

В основном классе:

SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment); transaction.addToBackStack(null); transaction.commit(); 

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

Кто-нибудь может мне с этим помочь?

Для ясности некоторые значимые классы:

Мой основной класс:

 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()); } } 

TabListener (из «Добавление вкладок Navigations» на сайт разработчика Android с некоторыми незначительными изменениями):

 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. } } 

И StationsFragment ( RouteFragment и DelaysFragment совпадают, только с другим текстом)

 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); } } 

Solutions Collecting From Web of "Переключение фрагментов внутри вкладки"

Так случилось, что в TabListener в методе onTabUnselected Fragment не был отсоединен, в результате чего он все еще показывался, пока показывался новый Fragment .

Причиной этого было то, что Fragment который был отсоединен, был первым фрагментом, а не моим вторым фрагментом. Я внес некоторые изменения.

В Управлении:

 SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment, "STATIONS"); transaction.addToBackStack(null); transaction.commit(); 

Здесь я добавил тег "STATIONS" в методе replace() , который является тем же самым тегом, что и первый фрагмент.
Теперь TabListener выглядит следующим образом:

 public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private final SherlockFragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private SherlockFragment mFragment; public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment == null) { mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag); } else { ft.attach(preInitializedFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment != null) { ft.detach(preInitializedFragment); } else if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } 

В методе onTabUnselected я теперь сначала извлекаю правильный Fragment , а затем отделяю его.

Надеюсь, это поможет кому-то!