在一些片段之间填充对象变量的最佳方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一些片段之间填充对象变量的最佳方法相关的知识,希望对你有一定的参考价值。

我需要使用从不同片段获得的数据填充自定义对象。一个选项是做一个parcelable对象并将它传递给每个片段,但我认为这是一个更好的选择,可以在活动中声明对象并从每个片段访问它而不需要移动数据。

这是最好的选择吗?

答案

您可以使用界面在片段和活动之间进行通信。

android文档说明非常简单,并提供了您需要的清晰示例,请在此处查看Communicating with Other Fragments

基本上你需要创建一个接口,在你的片段中声明它,你的活动应该实现它。如果片段中包含数据,则可以在活动中触发传递数据的事件,在活动中,您将拥有填充自定义对象的数据。

另一答案

您可以将数据存储在使用Fragment的数据setRetainInstance(true)中。 setRetainInstance控制是否在活动重新创建(例如从配置更改)中保留片段实例。

在Activity类中,实例化数据片段。然后可以在相同活动的多个片段之间共享它。

示例data Fragment类:

public class MyDataFragment extends Fragment {
    public static MyDataFragment newInstance() {
        return new MyDataFragment();
    }

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

        // Retain this instance so it isn't destroyed when MainActivity and MainFragment change configuration.
        setRetainInstance(true);
    }    

    // data shared across multiple fragments of same activity
    public String myData = null;
}

示例Activity类:

public class MyActivity extends AppCompatActivity {

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

    // common data fragment shared by multiple fragments
    final FragmentManager fm = getSupportFragmentManager();
    MyDataFragment myDataFragment = (MyDataFragment)fm.findFragmentByTag(MY_DATA_FRAGMENT);

    if (myDataFragment == null) {
        MyDataFragment dataFragment = MyDataFragment.newInstance();
        fm.beginTransaction().add(dataFragment, MY_DATA_FRAGMENT).commit();
    }
}

public static final String MY_DATA_FRAGMENT = "MY_DATA_FRAGMENT";

在各种片段中,您可以访问数据片段:

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

    // access data fragment
    final FragmentManager fm = getFragmentManager();
    this.myDataFragment = (MyDataFragment)fm.findFragmentByTag(MyActivity.MY_DATA_FRAGMENT);
}

private void function1 () {
    // read data from data Fragment
    String dataStr = this.myDataFragment.myData;

    // write data into data Fragment
    this.myDataFragment.myData = "test_string";
}

private MyDataFragment myDataFragment = null;

以上是关于在一些片段之间填充对象变量的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在片段和活动之间进行通信 - 最佳实践

更新片段参数的最佳实践?

在 SwiftUI 中装饰文本片段的最佳方法是啥?

片段之间的共享数据(父列表视图和子列表视图)

在两个片段之间拖放?

如何在活动和片段之间传递对象