防止片段恢复视图状态()



我有一个对象Foo,可以使用片段(FooFragment)进行配置。Foo 类包含对 FooFragment 和方法公共 Fragment 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上使用片段时,一切正常。显示正确的信息,一切正常。

当我在另一个对象 foo2 上第二次使用该片段时,打开片段会导致 foo1 中的所有属性(字段 1、字段 2 等)写入 foo2。我相信这是因为当再次添加片段时,restoreViewState() 方法会运行,它将 EditText 字段的值更改为 foo1 的值,导致 afterTextChanged() 方法触发,并将 foo1 的值写入 foo2。

我已经尝试了以下方法来解决问题:

- 每当调用 getConfigurationFragment() 时创建一个新的 FooFragment 对象。这有效,但我认为这不是最佳的,因为我知道避免在移动平台上不必要地创建对象是件好事。

-覆盖片段中的 onSaveInstanceState() 并发送空捆绑包。这不起作用,因为它看起来不会在片段关闭时被调用。它不起作用。

- 将setupFields()调用放在OnStart(),OnResume(),OnCreateView()中。这些都不起作用,因为当 restoreViewState() 运行时,它会破坏 foo2 对象。

- 在 onCreate() 和 onCreateView() 中将捆绑包设置为 null。不行。

我该怎么做才能将 foo2 信息加载到重用的片段中?

我对FragmentTransaction机制没有最好的理解。是否可以以某种方式告诉 FragmentManager 恢复视图状态?

我试图重用配置片段的想法是否存在根本缺陷并需要避免?如果是这样,为什么?

有没有其他魔法会导致它起作用?

提前感谢您的时间。

我在片段视图状态恢复方面也有类似的挣扎。防止这种情况的一种方法是在调用 restoreViewState() 之前清除包私有mSavedViewState字段:

package androidx.fragment.app;
import android.os.Bundle;
import android.view.View;
public class StatelessFragment extends Fragment {
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        mSavedViewState = null;
    }
}

最新更新