当前位置: 首页 > 知识库问答 >
问题:

正在防止片段restoreViewState()

仲孙景胜
2023-03-14

我有一个对象Foo,它可以使用片段(efFraank)进行配置。Foo类包含对FooFraank的静态引用和方法public Fraank getConfigurationFraank();此方法将当前对象分配给FooFraank并返回它。

public class Foo{
    private static FooFragment fooFragment = new FooFragment();

    html" target="_blank">public Fragment getConfigurationFragment(){
        fooFragment.setObject(this);
        return fooFragment;
    }

    //various getters and setters
}

足球碎片大致如下:

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(),并发送空捆绑包。这不起作用,因为当片段关闭时,它看起来不会被调用。它不起作用。

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

-在onCreate()和onCreateView()中将Bundle设置为空。不起作用。

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

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

我所尝试的重用配置片段的想法是否存在根本性缺陷,是否可以避免?如果是,为什么?

有没有其他魔法能让这一切起作用?

提前感谢您的时间。

共有1个答案

濮阳和泰
2023-03-14

我在片段视图状态恢复方面也有过类似的斗争。防止它的一种方法是在调用restoreViewState()之前清除package privatemsaveviewstate字段:

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

 类似资料:
  • 我有一个有3个选项卡的ViewPager。根据我所看到的情况,当容器活动开始时,前两个片段将处于恢复状态。我还注意到,只有并排的两个片段被恢复,第三个被停止。我遇到的问题是,我从网络加载数据用于第一个片段,并将自定义对象存储在一个ArrayList中,这很正常,但当我导航到第三个片段时,数据会随着第一个片段进入停止状态而丢失。因此,当从第三个片段导航回第一个片段时,ArrayList就会为空(我在

  • 我有一个带有三个Fragments的,让我们称它们为A、B和C。A在活动中调用。 并在按下某些按钮时被替换为片段B或C,并且FragmentTransaction调用。 但是,假设我连续三次调用片段B,我如何防止它自己堆积到它身上呢?同时我希望这是可能的:B呼叫

  • 嗨,伙计们,这是我的密码 我基本上只有2个碎片,只有家庭装饰应该添加到背面堆叠。在HomeFragment和OtherFragment之间切换了一段时间,然后在HomeFragment上单击back按钮,最后我会看到HomeFragment显示了好几次。在家庭框架内有一个回收视图。当我上下滚动时,我真的可以看到行显示了多次。我如何才能确保家庭装饰只添加到一次后堆栈。 谢谢

  • 我们使用的是片段,我们不需要在重新创建活动时自动恢复它们。但是,Android每次调用->时,都会恢复片段,即使我们对这些片段使用setRetaInstance(false)。 附言。我们知道,在为配置更改重新创建活动的情况下,可以通过在manifest中添加来完成。但是,在自动清理内存的情况下,如何重新创建活动呢?

  • 我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片

  • 您好,我已经使用导航组件和导航图从一个片段导航到另一个片段,我想要的是防止onBack完全按下,这样当用户单击onBack时,应用程序将退出。我正在从注册片段导航到主页片段。 这是导航图中的代码 这是我的代码,当点击注册按钮时,在注册片段中导航