【问题标题】:Send data between fragments在片段之间发送数据
【发布时间】:2018-11-18 17:24:31
【问题描述】:

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

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

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

当我更改 EditText 的值时,我会更改选项卡标题的值。并且它会正确更新。 (我从 tab0 转到 tab5,发送消息,tab0 的标题更改,因此收到消息。)但是当我返回 tab0 时,它变回原来的值(也是标签标题,但这是正确的工作) .

就像发生了所需的更改,但是当我切换回来时,它又恢复了原始值。它与销毁和保存实例有关吗?如何摆脱这个?

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

    }

}

【问题讨论】:

  • 请出示一些代码。
  • 不会给出答案,因为它只是一个盲拍,但如果它适用于 2 个片段,并且它没有更多片段,它们可能只是在开关上被刷新,试试这个: mViewPager.setOffscreenPageLimit(fragmentCount - 1)
  • @JMedinilla 太好了,这确实有效。谢谢!请把它放在答案中,然后我可以标记它。

标签: android fragment android-tablayout


【解决方案1】:

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

1.Fragment A -> Base Activity -> Fragment 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);
    }
}

【讨论】:

    【解决方案2】:

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

    如果您不打算执行繁重的任务,只需更改该限制即可。

    mViewPager.setOffScreenPageLimit(fragmentCount - 1)
    

    PD:作为一个提示,你不应该有超过 3 个选项卡,如果你能想到一个更好的方法而不是这个会更好。

    PD2:你也应该发布相关代码

    【讨论】:

    • 很公平,我添加了一些代码。在这种情况下,没有繁重的任务,多一点标签就可以了。如果我有更多,我肯定会使用其他东西。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多