2016-12-03 5 views
0

У меня есть Tablayout внутри моего MainActivity и Viewpager, который показывает три фрагмента.Как работает TabLayout?

При запуске приложения, это происходит:

onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

Это происходит при касании второй вкладки:

onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

Нажатие на вкладку третий:

onSaveInstanceState Fragment 1 

врезки на второй вкладке с третьей вкладки:

onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 

Код

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

private final List<Fragment> mFragmentList = new ArrayList<>(); 
private final List<String> mFragmentTitleList = new ArrayList<>(); 

public ViewPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    return mFragmentList.get(position); 
} 

@Override 
public int getCount() { 
    return mFragmentList.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return mFragmentTitleList.get(position); 
} 

public void addFragment(Fragment fragment, String title) { 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
} 
} 

В MainActivity

 viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tablayout); 
    tabLayout.setupWithViewPager(viewPager); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(DishFragment.newInstance(1), "Кулинария"); 
    adapter.addFragment(DishFragment.newInstance(2), "Кондитерская"); 
    adapter.addFragment(DishFragment.newInstance(3), "Хлебобулочная"); 
    viewPager.setAdapter(adapter); 
} 

 
onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

onSaveInstanceState Fragment 1 

onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
+0

ViewPager по умолчанию загрузки текущего фрагмента и смежных фрагментов. Я не уверен, что это то, о чем вы спрашиваете, хотя –

ответ

1

ViewPager удерживает соседние фрагменты в памяти для быстрого перехода между страницами. Я думаю, что есть исправление для воссозданных Фрагментов (поскольку вы храните их в списке, добавляйте, не создавая их самостоятельно более одного раза).

Когда приложение начал этот процесс происходит:

Я не уверен, что удвоенный OnCreate # 1, но фрагмент 1 и 2 запускаются

onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

Это происходит, когда нарезание резьбы вторым краном:

Фрагмент 1 & 2 уже были созданы, но Фрагмент 3 теперь создан

onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

Нажатие на третий кран:

ОС не нужно держать на фрагмент 1 больше

onSaveInstanceState Fragment 1 

Нарезание второго ответвления от третьего крана:

Фрагмент 1 создан/возобновлено

onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
+0

Хорошо, я вижу! Но я нашел другое недоразумение. Я использую один класс фрагмента для всех трех вкладок. И кажется, что элементы для следующего фрагмента добавляются выше предыдущих элементов. Хотя я создал три разных экземпляра фрагмента. Это проблема xml? может быть, нужно его очистить? –

+0

У вас есть только 3 'adapter.addFragment'. Я не уверен, что вы просите –

+0

Проблема была решена сама по себе. Я ничего не понял 'adapter = new ViewPagerAdapter (getSupportFragmentManager()); adapter.addFragment (DishFragment.newInstance (1), "Кулинария"); adapter.addFragment (DishFragment.newInstance (2), "Кондитерская"); adapter.addFragment (DishFragment.newInstance (3), "Хлебобулочная"); viewPager.setAdapter (адаптер); ' –