我有一个对象Foo可以使用片段进行配置(FooFragment)。 Foo 类包含对 FooFragment 的静态引用和方法公共片段 getConfigurationFragment();此方法将当前对象分配给 FooFragment 并返回它。
public class Foo{
private static FooFragment fooFragment = new FooFragment();
public Fragment getConfigurationFragment(){
fooFragment.setObject(this);
return fooFragment;
}
//various getters and setters
}
FooFragment大致如下:
public class FooFragment extends Fragment{
private Foo f;
private EditText field1, field2, etc;
public void setObject(Foo f){
this.f = f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate view
setupFieldListeners();
//return view object
}
@Override
private void onStart(){
super.onStart();
setupFields();
}
private void setupFields(){
field1.setText(f.getField1());
field2.setText(f.getField2());
//etc
}
private void setupListeners(){
field1.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable e){
f.setField1(e.getText().toString());
});
//Other empty necessary methods
field2.addTextChangedListener(new TextWatcher(){
//...
});
}
}
当我第一次在对象 foo1 上使用 Fragment 时,一切都运行良好。显示正确的信息并且一切正常。
当我在另一个对象 foo2 上第二次使用片段时,打开片段会导致 foo1 的所有属性(字段 1、字段 2 等)写入 foo2.我相信这是因为当再次添加 Fragment 时,restoreViewState() 方法会运行,它将 EditText 字段的值更改为 foo1 的值,导致 afterTextChanged() 方法触发,并将 foo1 的值写入foo2。
我已尝试以下方法来解决该问题:
-每当调用 getConfigurationFragment() 时创建一个新的 FooFragment 对象。这是可行的,但我认为这不是最佳的,因为我知道避免在移动平台上不必要地创建对象是有好处的。
- 重写 Fragment 中的 onSaveInstanceState() 并发送 null Bundle。这不起作用,因为当片段关闭时它看起来不会被调用。这不起作用。
- 将 setupFields() 调用放在 OnStart()、OnResume()、OnCreateView() 中。这些都不起作用,因为当 RestoreViewState() 运行时,它会破坏 foo2 对象。
- 在 onCreate() 和 onCreateView() 中将 Bundle 设置为 null。不起作用。
我该怎么做才能将 foo2 信息加载到重用的片段中?
我对FragmentTransaction机制没有最好的理解。是否有可能以某种方式告诉 FragmentManager 恢复视图状态?
正如我试图做的那样,重用配置片段的想法是否存在根本缺陷并需要避免?如果是这样为什么?
还有其他魔法可以让这个起作用吗?
在此先感谢您的时间。