在片段之间发送数据

时间:2018-11-18 08:42:57

标签: android fragment android-tablayout

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

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

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

当我更改EditText的值时,我也会更改选项卡标题的值。并且它会正确更新。 (我从tab0转到tab5,发送消息,tab0的标题更改了,所以收到了消息。)但是当我回到tab0时,它又变回了它的原始值(也是它的Tab标题,但这是正确的工作方式) 。

这就像发生了所需的更改一样,但是当我切换回去时,它又恢复了原始值。它与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);
        }
    });

在实现MainActivity.java的{​​{1}}中:

STab.SendData

2 个答案:

答案 0 :(得分:1)

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

1。片段A->基础活动->片段B(不推荐)    您可以使用父活动来传输数据。 2.使用Bundle对象。

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 :(得分:0)

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

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

mViewPager.setOffScreenPageLimit(fragmentCount - 1)

PD:作为一个提示,您应该永远不要超过3个标签,如果您可以考虑一个更好的方法而不是这个,那会更好。

PD2:您还应该发布相关代码