Фрагмент создается несколько раз в PagerAdapter

470
23 января 2017, 18:24

Есть MainActivity в нем есть фрагменты (DrawerMenu), в одном из них есть раздел Истории, который содержит еще 4 фрагмента подкрепляю через ViewPagerAdapter (табы). Так вот после очистки памяти на Kit Kat, MainActivity пересоздается вместе со всем остальным добром. Если юзать только 1 таб то вроде все хорошо, но после того как проюзать всю прогу несколько раз, то в логах выводится нечто подобное:

Create MainActivity
Create HsitoryFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment
Create PopularFragment

В DrawerMenu у фрагментов используется .replace(), так же проверяю на создание по тегу. По всей видимости это проблема с табами, но вопрос в том как исправить ситуацию?

MainActivity

onSaveInstanceState

    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getSupportFragmentManager().putFragment(outState, "fragment" + sharedPreferences.getInt("FRAGMENT", 0), myFragment);
}

onCreate

  if (savedInstanceState == null) {
        setFragment(sharedPreferences.getInt("FRAGMENT", 0));
    } else {
        myFragment = getSupportFragmentManager().getFragment(
                savedInstanceState, "fragment" + sharedPreferences.getInt("FRAGMENT", 0));
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment,    myFragment).commit();
    }

Вызов Fragment (DrawerMenu)

 public void setFragment(int position) {
    fragmentManager = getSupportFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    if(fragmentManager.findFragmentByTag("fragment" + position) != null) {
        myFragment = fragmentManager.findFragmentByTag("fragment" + position);
        fragmentTransaction.replace(R.id.fragment, myFragment);
        fragmentTransaction.commit();
        return;
    }else {
        switch (position) {
            case 0:                    
                myFragment = new FragmentHistory();
                break;
            case 1:
                myFragment = new FragmentGroup();
                break;
            case 2:
                myFragment = new FragmentDialogs();
                break;
            case 3:
                myFragment = new FragmentUsers();
                break;
        }
        sharedPreferences.edit().putInt("FRAGMENT", position).apply();
        fragmentTransaction.replace(R.id.fragment, myFragment, "fragment" + position);
        fragmentTransaction.commit();
    }
}

FragmentHistory

public void setupTubs()

 public void setupTabs() {
    tabsHistoryViewPagerAdapter = new   TabsHistoryViewPagerAdapter(getFragmentManager(), titles, tabNumber);
    pager = (ViewPager) view.findViewById(R.id.pager);
    pager.setAdapter(tabsHistoryViewPagerAdapter);
    tabs = (SlidingTabLayout) view.findViewById(R.id.tabs);
    tabs.setDistributeEvenly(false);
    tabs.setViewPager(pager);
 }

TabsHistoryViewPagerAdapter

getItem()

  @Override
public Fragment getItem(int position) {
    TabHistoryPopular tabHistoryPopular = new TabHistoryPopular();
    TabHistoryNew tabHistoryNew = new TabHistoryNew();
    TabHistoryCategory tabHistoryCategory = new TabHistoryCategory();
    TabHistoryFavorites tabHistoryFavorites = new TabHistoryFavorites();
    switch (position) {
        case 0:
            return tabHistoryPopular;
        case 1:
            return tabHistoryNew;
        case 2:
            return tabHistoryCategory;
        case 3:
            return tabHistoryFavorites;
    }
    return null;
}

SlidingTabLayout (extends HorizontalScrollView)

setViewPager(из FragmentHistory)

    public void setViewPager(ViewPager viewPager) {
    mTabStrip.removeAllViews();
    mViewPager = viewPager;
    if (viewPager != null) {
        viewPager.setOnPageChangeListener(new InternalViewPagerListener());
        populateTabStrip();
    }
}

public void populateTabStrip()

private void populateTabStrip() {
    final PagerAdapter adapter = mViewPager.getAdapter();
    final OnClickListener tabClickListener = new TabClickListener();
    for (int i = 0; i < adapter.getCount(); i++) {
        View tabView = null;
        TextView tabTitleView = null;
        if (mTabViewLayoutId != 0) {
            // If there is a custom tab view layout id set, try and inflate it
            tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
                    false);
            tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);
        }
        if (tabView == null) {
            tabView = createDefaultTabView(getContext());
        }
        if (tabTitleView == null && TextView.class.isInstance(tabView)) {
            tabTitleView = (TextView) tabView;
        }
        if (mDistributeEvenly) {
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams();
            lp.width = 0;
            lp.weight = 1;
        }
        tabTitleView.setText(adapter.getPageTitle(i));
        tabView.setOnClickListener(tabClickListener);
        String desc = mContentDescriptions.get(i, null);
        if (desc != null) {
            tabView.setContentDescription(desc);
        }
        mTabStrip.addView(tabView);
        if (i == mViewPager.getCurrentItem()) {
            tabView.setSelected(true);
        }
        tabTitleView.setTextColor(getResources().getColorStateList(R.color.tab_selector));
        tabTitleView.setTextSize(14);
    }
}
READ ALSO
Как спарсить страны ВК?

Как спарсить страны ВК?

Страны беру отсюда:

470
Как прочитать текст со своей структурой из fbx

Как прочитать текст со своей структурой из fbx

Есть файл fbx (ASCII)Хотел написать свой "читатель" (не знаю как это правильно назвать), но не знаю с чего начать

378
Как передать данные из Js в Jsf

Как передать данные из Js в Jsf

Всем приветРаботаю с web-приложением

418