2

I have an Activity with a ViewPager containing Fragments. the first fragment(book) create a nested fragment(singlebook) when click a button on it. Problem is that the first fragment and its component are gone when i came back from fragment3. I think it is related onSaveState or onDestroy.

I've tried Override onDestroy and used childFragmentManager on parent fragment(book) but it doesn't add to back stack.

MainActivity.java :

public class MainActivity extends FragmentActivity {

ViewPager viewPager;
MyPagerAdapter adapter;
public FragmentManager fragmentManager = getSupportFragmentManager();

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tl_tabs);
    viewPager = (ViewPager) findViewById(R.id.vp_12);

    Fragment[] fragments = new Fragment[3];
    fragments[0] = new Book();
    fragments[1] = new Search();
    fragments[2] = new Study();
    adapter = new MyPagerAdapter(fragmentManager, fragments);
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);
}
}

class MyPagerAdapter extends FragmentStatePagerAdapter {

    private Fragment[] fragments;

    public MyPagerAdapter(FragmentManager fm, Fragment[] fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return fragments[0];
            case 1:
                return fragments[1];
            case 2:
                return fragments[2];
            default:
                return fragments[0];
        }
    }

    @Override
    public int getCount() {
        return fragments.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {
            case 0:
                return "단어장";
            case 1:
                return "단어 검색";
            case 2:
                return "내 정보";
            default:
                return "";
        }
    }
}

Book.java :

public class Book extends Fragment {

FragmentManager fragmentManager;
private Button btn;
private EditText editText;

public Book() {
    // Required empty public constructor
}
@Override
public View onCreateView( LayoutInflater inflater,  ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_book, container, false);
    btn = (Button) view.findViewById(R.id.btn_toQuiz);
    editText =(EditText) view.findViewById(R.id.edit_text);
    ViewPager viewPager = (ViewPager) container;

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fragmentManager = getChildFragmentManager();

            fragmentManager.beginTransaction()
                    .add(R.id.fl_BookContainer,new singleBook(),"TAG")
                    .addToBackStack(null)
                    .commit();

        }
    });
    return view;
}

}
Mraz Jason
  • 25
  • 4

2 Answers2

0

By default FragmentStatePagerAdapter can only create two fragments and when you go to the third fragment it will remove the first one. so that the solution is you need to call setOffscreenPageLimit method save all fragments which added into pager adapter when set adapter into view pager.

Fragment[] fragments = new Fragment[3];
fragments[0] = new Book();
fragments[1] = new Search();
fragments[2] = new Study();
adapter = new MyPagerAdapter(fragmentManager, fragments);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(fragments.size());
tabLayout.setupWithViewPager(viewPager);
Nuon Veyo
  • 1
  • 1
0
viewPager = (ViewPager) findViewById(R.id.vp_12);


adapter = new MyPagerAdapter(fragmentManager, fragments);
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);

To

viewPager = (ViewPager) findViewById(R.id.vp_12);
viewPager.setOffscreenPageLimit(3);

adapter = new MyPagerAdapter(getChildFragmentManager(), fragments);
    viewPager.setAdapter(adapter);
    tabLayout.setupWithViewPager(viewPager);
Tanvir Dalal
  • 165
  • 7