Reputation: 942
I'm creating an apps to create a Sales Order. It has 1 fragment to show list of Sales Orders (ListFragment), 1 fragment to show Sales Order's form (FormFragment) and inside, there is a viewpager which has 2 fragments: HeaderFragment and ItemsFragment. When I accessed it the first time, it works fine, header and items are showing the input fields. But when I accessed it the second time, header and items are empty.
Here is how I open FormFragment from ListFragment:
public class ListFragment extends Fragment {
ListView listViewSO;
Bundle bundle;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
((MainActivity)getActivity()).getSupportActionBar().setTitle("SO LIST");
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_list_so, container, false);
bundle = getArguments();
listViewSO = root.findViewById(R.id.list_view_so);
listViewSO.setOnItemClickListener(SOListItemClick);
return root;
}
private AdapterView.OnItemClickListener SOListItemClick = new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
SalesOrder salesOrder = (ListFragment.this).adapter.getItem(i);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
bundle.putParcelable("salesorder", salesOrder);
FormFragment FormFragment = new FormFragment();
FormFragment.setArguments(bundle);
fragmentTransaction.replace(R.id.fragment_container, FormFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
};
}
This is my FormFragment
public class FormFragment extends Fragment {
Bundle bundle;
SalesOrder salesorder;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
((MainActivity)getActivity()).getSupportActionBar().setTitle("EDIT SO");
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_so_form, container, false);
((MainActivity)getActivity()).drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
((MainActivity)getActivity()).toggle.setDrawerIndicatorEnabled(false);
((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
bundle = getArguments();
salesorder = bundle.getParcelable("salesorder");
viewPager = (ViewPager) root.findViewById(R.id.view_pager);
setupViewPager(viewPager);
tabLayout = (TabLayout) root.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
return root;
}
private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapter adapter = new SectionsPageAdapter(getActivity().getSupportFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
adapter.addFragment(new HeaderFragment(), "Header");
adapter.addFragment(new ItemFragment(), "Items");
adapter.addBundle(bundle);
viewPager.setAdapter(adapter);
}
}
This is my adapter:
public class SectionsPageAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public SectionsPageAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
public void addBundle(Bundle bundle) {
for(int i = 0; i < mFragmentList.size(); i++) {
mFragmentList.get(i).setArguments(bundle);
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
@NonNull
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
}
And lastly, this is my HeaderFragment
public class VisitationSOHeaderFragment extends Fragment {
Bundle bundle;
SalesOrder salesorder;
TextInputLayout textInputSoCode, textInputSoDate;
ProgressBar loading;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_visitation_so_header, container, false);
bundle = getArguments();
salesorder = bundle.getParcelable("salesorder");
loading = root.findViewById(R.id.loading);
textInputSoCode = root.findViewById(R.id.text_input_so_code);
textInputSoDate = root.findViewById(R.id.text_input_so_date);
textInputSoCode.getEditText().setText(salesorder.getSoCode());
textInputSoDate.getEditText().setText(salesorder.getSoDate());
return root;
}
}
How is it happen? Is there something wrong with the viewpager settings? Any help would be much appreciated.
Upvotes: 0
Views: 205
Reputation: 1332
Do not use getActivity().getSupportFragmentManager()
to get fragment manager for FragmentPagerAdapter
. Just use getChildFragmentManager
method instead.
Upvotes: 1