简体   繁体   中英

How to use getChildFragmentManager with a class that extends Dialog fragment

I am a having a fragment with TabLayout. As soon as I move from TabLayout Fragment to the next Fragment and press the back key. The content on the default TabLayout fragment disappears. I found a possible solution to this in the post . Following is the code for the TabLayout.

public class IndividualCollectionSheetFragment extends MifosBaseFragment {

private TabLayout tabLayout;
private ViewPager viewPager;
private View rootView;

public IndividualCollectionSheetFragment() {
}

public static IndividualCollectionSheetFragment newInstance() {
    Bundle args = new Bundle();
    IndividualCollectionSheetFragment fragment = new IndividualCollectionSheetFragment();
    fragment.setArguments(args);
    return fragment;
}

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

@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
                         @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_individual_recycler, container, false);
    ButterKnife.bind(this, rootView);
    setToolbarTitle(getStringMessage(R.string.individual_collection_sheet));
    viewPager = rootView.findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = rootView.findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    return rootView;
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager());
    adapter.addFragment(new NewIndividualCollectionSheetFragment(), Constants.NEW);
    adapter.addFragment(new SavedIndividualCollectionSheetFragment(), Constants.SAVED);
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

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

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

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

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

  }

The solution in the post suggested using getChildFramentManager instead of getSupportFragmentManager . As soon as I changed to getChildFragmentManager. I got the error.

        java.lang.IllegalStateException: Fragment CollectionSheetDialogFragment{572dd42 #0 Identifier Dialog Fragment} declared target fragment NewIndividualCollectionSheetFragment{45e8153 #0 id=0x7f090361 android:switcher:2131297121:0} that does not belong to this FragmentManager!

which might be because of the class CollectionSheetDialogFragment which extends DialogFragment and there must be inconsistencies with the different Fragment Managers being used.

NewIndividualCollectionSheet.java (first fragment in tablayout)

       public class NewIndividualCollectionSheetFragment extends MifosBaseFragment implements
    IndividualCollectionSheetMvpView, MFDatePicker.OnDatePickListener,
    Spinner.OnItemSelectedListener, View.OnClickListener {

@BindView(R.id.btn_fetch_collection_sheet)
Button btnFetchSheet;

@BindView(R.id.sp_office_list)
Spinner spOffices;

@BindView(R.id.sp_staff_list)
Spinner spStaff;

@BindView(R.id.tv_repayment_date)
TextView tvRepaymentDate;

@Inject
NewIndividualCollectionSheetPresenter presenter;

private IndividualCollectionSheet sheet;
private DialogFragment datePicker;
private RequestCollectionSheetPayload requestPayload;
private View rootView;
private ArrayAdapter<String> officeAdapter;
private ArrayList<String> officeNameList;
private List<Office> officeList;
private ArrayAdapter<String> staffAdapter;
private ArrayList<String> staffNameList;
private List<Staff> staffList;
private int officeId;
private int staffId;
private int requestCode = 1;
private boolean success = true;

private String actualDisbursementDate;
private String transactionDate;


public NewIndividualCollectionSheetFragment() {

}

public static NewIndividualCollectionSheetFragment newInstance() {
    Bundle args = new Bundle();
    NewIndividualCollectionSheetFragment fragment = new NewIndividualCollectionSheetFragment();
    fragment.setArguments(args);
    return fragment;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((MifosBaseActivity) getActivity()).getActivityComponent().inject(this);
    if (savedInstanceState != null) {
        sheet = (IndividualCollectionSheet) savedInstanceState.get(
                Constants.EXTRA_COLLECTION_INDIVIDUAL);
    }
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_new_collection_sheet, container, false);
    ButterKnife.bind(this, rootView);
    setToolbarTitle(getStringMessage(R.string.individual_collection_sheet));
    presenter.attachView(this);

    setUpUi();
    return rootView;
}

private void setUpUi() {
    setRepaymentDate();
    officeNameList = new ArrayList<>();
    officeAdapter = new ArrayAdapter<>(getActivity(),
            android.R.layout.simple_spinner_item, officeNameList);
    officeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spOffices.setAdapter(officeAdapter);
    spOffices.setOnItemSelectedListener(this);

    staffNameList = new ArrayList<>();
    staffAdapter = new ArrayAdapter<>(getActivity(),
            android.R.layout.simple_spinner_item, staffNameList);
    staffAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spStaff.setAdapter(staffAdapter);
    tvRepaymentDate.setOnClickListener(this);
    btnFetchSheet.setOnClickListener(this);
    presenter.fetchOffices();

}

void setRepaymentDate() {
    datePicker = MFDatePicker.newInsance(this);
    String date = DateHelper.
            getDateAsStringUsedForCollectionSheetPayload(MFDatePicker.getDatePickedAsString());
    tvRepaymentDate.setText(date.replace('-', ' '));
    transactionDate = date.replace('-', ' ');
    actualDisbursementDate = transactionDate;
}

private void prepareRequestPayload() {
    requestPayload = new RequestCollectionSheetPayload();
    requestPayload.setOfficeId(officeId);
    requestPayload.setStaffId(staffId);
    requestPayload.setTransactionDate(tvRepaymentDate.getText().toString());
}

@Override
public void setOfficeSpinner(List<Office> offices) {
    officeList = offices;
    officeNameList.clear();
    officeNameList.add(getString(R.string.spinner_office));
    officeNameList.addAll(presenter.filterOffices(officeList));
    officeAdapter.notifyDataSetChanged();
}

@Override
public void onDatePicked(String date) {
    String d = DateHelper.getDateAsStringUsedForCollectionSheetPayload(date);
    tvRepaymentDate.setText(d.replace('-', ' '));
}

public void retrieveCollectionSheet() {
    prepareRequestPayload();
    presenter.fetchIndividualCollectionSheet(requestPayload);
}

public void setTvRepaymentDate() {
    datePicker.show(getActivity().getSupportFragmentManager(),
            FragmentConstants.DFRAG_DATE_PICKER);
}


@Override
public void setStaffSpinner(List<Staff> staffs) {

    spStaff.setOnItemSelectedListener(this);
    staffList = staffs;
    staffNameList.clear();
    staffNameList.add(getString(R.string.spinner_staff));
    staffNameList.addAll(presenter.filterStaff(staffList));
    staffAdapter.notifyDataSetChanged();
}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    switch (adapterView.getId()) {
        case R.id.sp_office_list:
            if (i == officeList.size() || i == 0) {
                Toaster.show(rootView, getStringMessage(R.string.error_select_office));
            } else {
                Toaster.show(rootView, officeNameList.get(i));
                officeId = officeList.get(i - 1).getId();
                presenter.fetchStaff(officeId);
            }
            break;

        case R.id.sp_staff_list:
            if (i == staffList.size() || i == 0) {
                Toaster.show(rootView, getStringMessage(R.string.error_select_staff));
            } else {
                staffId = staffList.get(i - 1).getId();
            }
            break;
    }

}

public void popupDialog() {
    CollectionSheetDialogFragment collectionSheetDialogFragment =
            CollectionSheetDialogFragment.newInstance(tvRepaymentDate.getText().toString(),
            sheet.getClients().size());
    collectionSheetDialogFragment.setTargetFragment(this, requestCode);
    FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager()
            .beginTransaction();
    fragmentTransaction.addToBackStack(FragmentConstants.FRAG_DOCUMENT_LIST);
    collectionSheetDialogFragment.show(fragmentTransaction, "Identifier Dialog Fragment");
}

public void getResponse(String response) {
    switch (response) {
        case "FillNow":
            FragmentManager fm = getActivity()
                    .getSupportFragmentManager();
            fm.popBackStack();
            IndividualCollectionSheetDetailsFragment frag = new
                    IndividualCollectionSheetDetailsFragment().newInstance(sheet,
                    actualDisbursementDate, transactionDate);
            ((MifosBaseActivity) getActivity()).replaceFragment(frag,
                    true, R.id.container);
            break;
    }
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}

@Override
public void showSheet(IndividualCollectionSheet individualCollectionSheet) {
    sheet = individualCollectionSheet;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable(Constants.EXTRA_COLLECTION_INDIVIDUAL, sheet);
}

@Override
public void showSuccess() {
    if (success) {
        popupDialog();
    }
}

@Override
public void showError(String message) {
    Toaster.show(rootView, message);
}

@Override
public void showNoSheetFound() {
    success = false;
    Toaster.show(rootView, getStringMessage(R.string.no_collectionsheet_found));
}

@Override
public void showProgressbar(boolean b) {
    if (b) {
        showMifosProgressDialog();
    } else {
        hideMifosProgressDialog();
    }
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.tv_repayment_date:
            setTvRepaymentDate();
            break;

        case R.id.btn_fetch_collection_sheet:
            retrieveCollectionSheet();
            break;
    }

}
}

CollectionSheetDialogFragment.java

     public class CollectionSheetDialogFragment extends DialogFragment {
@BindView(R.id.tv_due_date)
TextView tvDueDate;

@BindView(R.id.tv_members)
TextView tvMembers;

@BindView(R.id.btn_fillnow)
Button btnFillnow;

@BindView(R.id.btn_cancel)
Button btnCancel;

private View rootView;
private String date;
private int members;

public CollectionSheetDialogFragment() {

}

public static CollectionSheetDialogFragment newInstance(String date, int members) {

    CollectionSheetDialogFragment collectionSheetDialogFragment =
            new CollectionSheetDialogFragment();
    Bundle args = new Bundle();
    args.putString(Constants.REPAYMENT_DATE, date);
    args.putInt(Constants.MEMBERS, members);
    collectionSheetDialogFragment.setArguments(args);
    return collectionSheetDialogFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((MifosBaseActivity) getActivity()).getActivityComponent().inject(this);
    date = getArguments().getString(Constants.REPAYMENT_DATE);
    members = getArguments().getInt(Constants.MEMBERS);
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable
        ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_collection_sheet_dialog, container, false);
    ButterKnife.bind(this, rootView);
    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    tvDueDate.setText(date);
    tvMembers.setText(Integer.toString(members));
}

@OnClick(R.id.btn_fillnow)
public void setBtnFillnow() {
    ((NewIndividualCollectionSheetFragment) getTargetFragment()).getResponse("FillNow");
}

@OnClick(R.id.btn_cancel)
public void setBtnCancel() {
    getDialog().dismiss();
}
   }

Can someone help me get around this error so I can persist the TabLayout On back press?

也许这项工作:替换getFragmentManager()而不是getChildFragmentManager()

Try this changing seupViewPager() in IndividualCollectionSheetFragment.java like this

private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getChildFragmentManager());
adapter.addFragment(new NewIndividualCollectionSheetFragment(), Constants.NEW);
adapter.addFragment(new SavedIndividualCollectionSheetFragment(), Constants.SAVED);
viewPager.setAdapter(adapter);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM