Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止片段restoreViewState()_Java_Android_Android Fragments_State - Fatal编程技术网

Java 防止片段restoreViewState()

Java 防止片段restoreViewState(),java,android,android-fragments,state,Java,Android,Android Fragments,State,我有一个对象Foo,可以使用片段(FooFragment)进行配置。Foo类包含对FooFragment的静态引用和方法public Fragment getConfigurationFragment();此方法将当前对象分配给FooFragment并返回它 public class Foo{ private static FooFragment fooFragment = new FooFragment(); public Fragment getConfigurationF

我有一个对象Foo,可以使用片段(FooFragment)进行配置。Foo类包含对FooFragment的静态引用和方法public 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中的所有属性(field1、field2等)写入foo2。我认为这是因为当再次添加片段时,restoreViewState()方法会运行,它会将EditText字段的值更改为foo1的值,从而引发extextchanged()方法,并将foo1的值写入foo2

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

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

-重写片段中的onSaveInstanceState()并发送空绑定。这不起作用,因为当片段关闭时,它看起来不会被调用。它不起作用

-在OnStart()、OnResume()和OnCreateView()中放置setupFields()调用。当restoreViewState()运行时,这些操作都不会影响foo2对象

-在onCreate()和onCreateView()中将绑定设置为null。不起作用

我如何才能将foo2信息加载到重用的片段中

我对碎片交易机制没有最好的理解。是否可以告诉FragmentManager恢复视图状态

像我试图做的那样重用配置片段的想法从根本上来说是有缺陷的并且是可以避免的吗?如果是,为什么

有没有其他的魔法能让它起作用


提前感谢您的时间。

我在片段视图状态恢复方面也遇到了类似的困难。防止它的一种方法是在调用
restoreViewState()
之前清除package private
msaveviewstate
字段:

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;
    }
}

这看起来像一个非常奇怪的结构。你想用这种模式实现什么?你说的“使用”这些碎片到底是什么意思?您是存储本地配置还是全局配置?请为您的问题添加更多细节。1-我试图通过只创建FooFragment对象的一个实例并在需要编辑Foo的属性时重用它来最小化对象创建和垃圾收集的数量。2-通过使用片段,我的意思是在给定的foo上运行getConfigurationFragment()方法。3-我试着在问题中尽可能多地给出细节。你能告诉我更多有帮助的具体细节吗?