如何在片段之间保留数据

时间:2014-01-24 10:01:49

标签: android android-fragments

我正在使用3个片段A,B,C和Tabhost片段活动

Frag A,B,C每个包含一些只属于一个类的字段。那就是Say Employee类

A包含EMpnm,EmpAge,EmpNo B包含EMpJoinDt,EmpSal C包含EmpHobby,EmpPersonalDtls

导航是使用下一个按钮

的A-> B-> C.

Employee类是public .data frm,每个片段使用getter / Setter设置为Employee类 每个片段都有Employee emp = new Employee()对象

因此,每次数据在下一个按钮上消失时,从Frag A到B点击,因此数据dnt由emp对象保存,如何保留片段1到2到3的数据,以便在提交完整的Class员工时最后提交值为DB

是共享首选项的最佳解决方案吗? 这是我的案例的好方法吗?使用捆绑

[链接] Pass data between fragments 注意:每个片段都有相同的类

3 个答案:

答案 0 :(得分:3)

SharedPreferences绝对不是一个好的解决方案。它被设计为基本数据类型的键/值数据存储。此外,它应该用于应用程序范围的首选项,而不是缓存业务数据。

最好将公共对象存储在托管所有片段的活动中,并通过onSaveInstanceState/onRestoreInstanceState机制保存/恢复它。

或者,您可以创建无UI片段来保存共享数据。在初始化其他片段之前,您可以在活动中添加此片段。

然后您可以通过getFragmentManager().findFragmentByTag("YOUR_TAG)访问此类片段。在这种情况下,您需要在片段中保存对象实例状态,以防止配置更改中的状态丢失。

作为数据持有者的简单活动概念:

public interface EmployeeDataHolder {
    EmployeeData getEmployeeData();
}

public class ExampleActivity extends Activity implements EmployeeDataHolder {
  private EmployeeData mEmployeeData;

  @Override
  public EmployeeData getEmployeeData() {
    return mEmployeeData;
  }
}

public class ExampleFragment extends Fragment{

  EmployeeDataHolder mEmployeeDataHolder;

  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof EmployeeDataHolder) {
      mEmployeeDataHolder = (EmployeeDataHolder) activity;
    } else 
      throw new IllegalStateException("Activity must implement EmployeeDataHolder interface");
  }

  private void yourEmployeeDataProcessingMethod(){
    EmployeeData employeeData = mEmployeeDataHolder.getEmployeeData();
    // process data, populate views etc.
  }

  @Override
  public void onDetach() {
    super.onDetach();
    mEmployeeDataHolder = null;
  }
}

答案 1 :(得分:0)

共享偏好绝对是一种选择。

更简单,您可以使Employee holder类的字段保持静态。这样,设置为字段的值将保留为通过片段的增量输入数据。

答案 2 :(得分:0)

您应该通过此mViewPager.setCurrentItem(currentPage, true);更改片段导航 这些数据字段将自动保留。

如果您想访问所有片段数据和字段,可以试试这个。

YourFragment fragment = new YourFragment();
fragment.editText.getText().toString();