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

如何在重新创建片段之前保存数据?

叶健柏
2023-03-14

我尝试在片段子类中使用onSaveInstanceState(Bundle outState)方法保存数据。

解释:我创建了一个类FragmentA,它扩展了这个类中的Fragment。我有一个变量名count,当我单击按钮时,count的值发生了变化(最初count=0)。我想保存count的值,即使方向发生了变化(纵向到横向,反之亦然)。我的MainActivity类动态加载片段。

我的代码:

此类扩展了片段:-

public class FragmentA extends Fragment implements View.OnClickListener {
Button change_After_Click;
    int count=0;
    Communicator com;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState!=null){
            count=savedInstanceState.getInt("counter",0);
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_a_layout, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        System.out.println("onActivityCreated");
        com= (Communicator) getActivity();
        change_After_Click=(Button)getActivity().findViewById(R.id.textChangeClick);
        change_After_Click.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

count=count+1;
        com.proviedLinkBothFragment("button click "+ count);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("counter",count);
    }
}

MainActivity类在此动态加载片段:-

public class MainActivity extends AppCompatActivity implements Communicator {
Button btn;
    FragmentManager   fragmentManager;
    FragmentTransaction fragmentTransaction;
    FragmentB obj;
    FragmentA objA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        System.out.println("ge low");


                    fragmentManager=getSupportFragmentManager();
                    fragmentTransaction=fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.relativeLayout,new FragmentA());

                    fragmentTransaction.commit();




    }



    @Override
    public void proviedLinkBothFragment(String s) {

           FragmentB fb= (FragmentB) fragmentManager.findFragmentById(R.id.relativeLayout);
        fb.changeText(s);


    }


}

共有1个答案

晏华奥
2023-03-14

在activity的方法onCreate中,您应该在替换片段之前检查片段是否已经存在。当你添加一个片段时,你应该为这个片段使用一个标记(“MY_标记”),然后你可以通过一个标记找到一个片段。您不需要手动重新创建片段(我想在旋转期间)。系统为你做的。

fragmentManager=getSupportFragmentManager();
if (fragmentManager.findFragmentByTag("MY_TAG") == null) {
    fragmentTransaction=fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.relativeLayout,new FragmentA(), "MY_TAG");

    fragmentTransaction.commit();
}
 类似资料:
  • 我正在进行一项活动,其中有TabLayout和两个表示选项卡内容的片段。我在活动的OnCreate方法中手动管理打开选项卡的当前状态: 这只是一个简单的例子。我真正的代码是用C语言编写的,并且有一些其他逻辑来存储和管理活动重启之间的状态。 配置更改时的问题(例如开关方向): 打开的碎片被摧毁 活动被破坏 活动重启 在onCreate方法中,当调用super.onCreate(savedInstan

  • 当使用底部导航视图在片段之间切换时,每次按下按钮时都会重新创建片段。 这是我的代码:

  • 我正在开发一个android应用程序,它使用导航抽屉在两个片段之间切换。然而,每次我切换时,片段都会被完全重新创建。 这是我主要活动的代码。 我设置了一些调试日志记录,每次调用selectItem时,都会销毁一个片段,而创建另一个片段。 有什么方法可以防止碎片被重新创建,而只是重复使用它们吗?

  • 因为我们知道progressdialog需要一个参数上下文或获取片段的活动,但在解除对话框后,它转到了另一个片段,我将其设置为mainactivity默认片段为homepage 这是我课堂上使用的方法

  • 我正在通过片段“A”调用从服务器获取数据。当我用“B”替换“A”时,在从“B”返回到“A”之后,每次都会调用片段“A”,因此每次都会生成HTTPGET。如何避免这种情况,并在活动中重用类似REORDER_to_FRONT的片段? 我正在使用此代码替换为新片段 当我反压时,

  • 问题内容: 我的Spring-Boot-Mvc-Web应用程序在文件中具有以下数据库配置: 这是我所做的唯一配置。我在任何地方都没有进行任何其他配置。尽管如此,Spring和子系统会在每次Web应用程序运行时自动重新创建数据库。即在系统运行时重新创建数据库,而在应用程序结束后它包含数据。 我不了解此默认值,并期望它适合测试。 但是,当我开始运行测试时,我发现数据库仅重建一次。由于没有按预定义的顺序