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

问题描述 投票:-1回答:2

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

这是最好的选择吗?

android object android-fragments android-activity
2个回答
0
投票

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

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

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


0
投票

您可以将数据存储在使用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;
© www.soinside.com 2019 - 2024. All rights reserved.