在片段之间发送数据

Send data between fragments

我已经使用本教程学习了如何在片段之间传递数据:

https://www.journaldev.com/14207/android-passing-data-between-fragments

如果我有两个片段,它会完美地工作。但是我的应用程序需要更多 (7) 个片段。这些片段是 tablayout 上的选项卡。当我在彼此相邻的两个选项卡之间来回切换时,这很好。但是,一旦我从 tab0 切换到更远的选项卡 (tab5),发送消息,然后在 tab0 上检查它,EditText 就会恢复其原始值。

当我更改 EditText 的值时,我更改了选项卡标题的值。它会正确更新。 (我从 tab0 转到 tab5,发送消息,tab0 的标题发生变化,因此收到了消息。)但是当我回到 tab0 时,它又变回了它的原始值(还有它的标签标题,但这是正确的工作) .

就像发生了所需的更改,但是当我切换回来时,它又恢复了原始值。跟destroying和savedInstances有关系吗?如何摆脱这个?

STab.java中(标签的代码):

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    try {
        SD = (SendData) getActivity();
    } catch (ClassCastException e) {
        throw new ClassCastException("Error in retrieving data. Please try again");
    }
}
interface SendData {
    void setStructureBonusTileSpinner(int position, int currentTabNumber);
}

protected void setStructureBonusTileSpinner(int position){
    spinnerStructureBonusTile.setSelection(position);
}

同样在STab.java,在onViewCreated方法中:

spinnerStructureBonusTile.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            SD.setStructureBonusTileSpinner(spinnerStructureBonusTile.getSelectedItemPosition(), tabNumber);
        }
    });

在实现STab.SendDataMainActivity.java中:

@Override
public void setStructureBonusTileSpinner(int position, int currentTabNumber) {

    for(int i = 0; i < mSectionsPagerAdapter.getCount(); i++){

        if(i != currentTabNumber) {
            String tag = "android:switcher:" + R.id.container + ":" + i;
            STab f = (STab) getSupportFragmentManager().findFragmentByTag(tag);
            if(f != null){
                f.setStructureBonusTileSpinner(position);
            }
        }

    }

}

如果您将数据从片段 A 传输到片段 B,请执行以下操作。

1.Fragment A -> 基础 Activity -> 片段 B(不推荐) 您可以使用 parent activity 传输数据。 2.Using 捆绑对象。

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

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

默认情况下,屏幕外页面限制设置为 1,因此您所说的两个相邻片段之外的片段将从适配器重新创建。

如果您不打算执行繁重的任务,只需更改该限制就足够了。

mViewPager.setOffScreenPageLimit(fragmentCount - 1)

PD:作为提示,您的选项卡永远不要超过 3 个,如果您能想到更好的方法而不是这个会更好。

PD2:你还应该post相关代码