MichaelStoddart
MichaelStoddart

Reputation: 5639

Layout displaying prolems when using back stack

Im having an issue when using the android back stack. So im in my fragment 1 then go to fragment 2, adding to fragment 1 to back stack. All is fine at this point.

Then when i press the back button whilst in fragment 2 and call popBackStack, fragment 1 then displays again, again all is fine at this point.

Then when i try and go from fragment 1 back to fragment 2, all i see is a blank fragment.

Fragment 2 contains a view pager dynamically populated with more fragments.

Any ideas on what is causing this?

Here are some code samples that should helps

onBackPressed that calls popBackStack (in container activity):

@Override
public void onBackPressed() {

    if (drawerOpen) {
        closeDrawer();
    } else if(fragMan.getBackStackEntryCount() > 0){
        fragMan.popBackStackImmediate();
        return;
    } else {
        finish();
        return;
    }

    super.onBackPressed();
}

Fragment 1 being replaced with fragment 2 (in container activity):

transaction.replace(fl_frag_container.getId(), new ViewTicketFragment());
transaction.addToBackStack(null);
transaction.commit();

Fragment 1 code:

public class MyTicketsFragment extends Fragment {

LinearLayout ll_parent_layout;

public MyTicketsFragment() {}


public static MyTicketsFragment newInstance() {
    return new MyTicketsFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_my_tickets, container, false);

    ((HomeActivity) getActivity()).hideMapIcon(View.GONE, true);
    ((HomeActivity) getActivity()).hideSpacerLayout(View.GONE);
    ((HomeActivity) getActivity()).hideSearchIcon(View.INVISIBLE, true);

    ll_parent_layout = (LinearLayout) view.findViewById(R.id.ll_parent_layout);
    makeNetworkCall();


    return view;
}

private void makeNetworkCall(){


    //Onresult
    setupScrollView();
}

private void setupScrollView(){
    TicketObject obj = new TicketObject("This is a ticket", "28th May 2016");

    for(int i = 0; i < 20; i++){
        ll_parent_layout.addView(getScrollItem(obj));
    }

}

private LinearLayout getScrollItem(TicketObject ticket){
    LinearLayout layout = (LinearLayout) LayoutInflater.from(getActivity()).inflate(R.layout.ticket_list_item, ll_parent_layout, false);

    ImageView img_cal_icon = (ImageView) layout.findViewById(R.id.img_cal_icon);
    AutofitTextView txt_description = (AutofitTextView) layout.findViewById(R.id.txt_ticket_name);
    AutofitTextView txt_date = (AutofitTextView) layout.findViewById(R.id.txt_ticket_date);

    txt_description.setTypeface(FontClass.getOpenSansRegular(getContext()));
    txt_date.setTypeface(FontClass.getOpenSansLight(getContext()));

    txt_description.setText(ticket.getDescription());
    txt_date.setText(ticket.getDate());


    layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ((HomeActivity) getActivity()).setSecondaryFrag(Constants.VIEW_TICKETS);
        }
    });


    return layout;
}

}

Fragment 2 code:

public class ViewTicketFragment extends Fragment {

private static final String ARG_PARAM1 = "param1";

private ViewPager pager;
private ArrayList<Fragment> fragList;

View view;

private String mParam1;

public ViewTicketFragment() {
    // Required empty public constructor
}

public static ViewTicketFragment newInstance(String param1) {
    ViewTicketFragment fragment = new ViewTicketFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_view_ticket, container, false);


    return view;

}

@Override
public void onResume() {
    super.onResume();
    setupPager(view);
}

private void setupPager(View view) {
    fragList = new ArrayList<>();
    fragList.add(new TicketPagerItemFragment());
    fragList.add(new TicketPagerItemFragment());

    pager = (ViewPager) view.findViewById(R.id.pager);

    FragmentPagerAdapter adapter = new FragmentPagerAdapter(getFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            return fragList.get(position);
        }

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

    pager.setAdapter(adapter);

    pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}
}

Upvotes: 0

Views: 44

Answers (1)

PiKos
PiKos

Reputation: 1384

When you use ViewPager inside Fragment you have to use Fragment.getChildFragmentManager()

Replace

new FragmentPagerAdapter(getFragmentManager())

with this:

new FragmentPagerAdapter(getChildFragmentManager())

It should help

Upvotes: 1

Related Questions