【问题标题】:How to use getChildFragmentManager with a class that extends Dialog fragment如何将 getChildFragmentManager 与扩展对话框片段的类一起使用
【发布时间】:2018-07-08 13:22:38
【问题描述】:

我有一个带有 TabLayout 的片段。一旦我从 TabLayout Fragment 移动到下一个 Fragment 并按返回键。默认 TabLayout 片段上的内容消失。我在post 中找到了可能的解决方案。以下是 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);
    }
}

  }

帖子中的解决方案建议使用 getChildFramentManager 而不是 getSupportFragmentManager。一旦我更改为 getChildFragmentManager。我得到了错误。

        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!

这可能是因为 CollectionSheetDialogFragment 类扩展了 DialogFragment 并且必须与正在使用的不同片段管理器不一致。

NewIndividualCollectionSheet.java(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();
}
   }

有人可以帮我解决这个错误,以便我可以将 TabLayout On back press 保留下来吗?

【问题讨论】:

    标签: java android android-fragments android-dialogfragment android-tablayout


    【解决方案1】:

    像这样尝试在 IndividualCollectionSheetFragment.java 中更改 seupViewPager()

    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);
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-07-02
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多