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

Android-保存/恢复片段状态

滕胜涝
2023-03-14
public class Activity_Main extends FragmentActivity{

public static Fragment_1 fragment_1;
public static Fragment_2 fragment_2;
public static Fragment_3 fragment_3;
public static FragmentManager fragmentManager;

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

     fragment_1 = new Fragment_1();

     fragment_2 = new Fragment_2();

     fragment_3 = new Fragment_3();

     fragmentManager = getSupportFragmentManager();
     FragmentTransaction transaction_1 = fragmentManager.beginTransaction();
     transaction_1.replace(R.id.content_frame, fragment_1);
     transaction_1.commit();
}}
public class Fragment_1 extends Fragment {

      private EditText title;
      private Button go_next;


      @Override
      public View onCreateView(final LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_1,
            container, false);

            title = (EditText) rootView.findViewById(R.id.title);

            go_next = (Button) rootView.findViewById(R.id.go_next);

            image.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View v) {

                 FragmentTransaction transaction_2 = Activity_Main.fragmentManager
                .beginTransaction();

                 transaction_2.replace(R.id.content_frame,
                  Activity_Main.fragment_2);
                 transaction_2.addToBackStack(null);
                 transaction_2.commit();  

            });
        }}

我搜索了很多信息,但没有一个明确的。有人能给出一个明确的解决方案和一个例子吗?

共有1个答案

朱宜
2023-03-14

当一个片段被移动到后堆栈时,它不会被破坏。所有的实例变量都保留在那里。所以这里是保存数据的地方。在onActivityCreated中,检查以下条件:

  1. 是束!=null吗?如果是,则在那里保存数据(可能是方向更改)。
  2. 是否有数据保存在实例变量中?如果是,从它们中恢复您的状态(或者什么也不做,因为一切都是应该的)。
  3. 否则首次显示您的片段,请重新创建所有内容。

编辑:这里有一个例子

public class ExampleFragment extends Fragment {
    private List<String> myData;

    @Override
    public void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable("list", (Serializable) myData);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (savedInstanceState != null) {
            //probably orientation change
            myData = (List<String>) savedInstanceState.getSerializable("list");
        } else {
            if (myData != null) {
                //returning from backstack, data is fine, do nothing
            } else {
                //newly created, compute data
                myData = computeData();
            }
        }
    }
}
 类似资料:
  • 我试图理解使用片段保存和恢复状态的过程。我用它创建了滑动导航菜单。 其中一个片段中有以下代码: 例如,我想在用户退出片段之前保存复选框的状态,并在再次创建片段时恢复它。如何实现这一点? 编辑: 根据raxellson的回答,我将片段更改为: 我已被记录,因此未保存savedInstanceState。我做错了什么?

  • 在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔。如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只笔,要用哪只就选哪只。 在Canvas中也可以这样,不过Canvas中的画笔永远只有一只。所以,如果要更换画笔的颜色,就需要保存和恢复状态。状态其实就是画布当前属性的一个快照,包括: 图形的属性值,如strokeS

  • 状态的保存与恢复 操作流程 为了状态的保存与恢复,我们可以先用栈上的一小段空间来把需要保存的全部通用寄存器和 CSR 寄存器保存在栈上,保存完之后在跳转到 Rust 编写的中断处理函数;而对于恢复,则直接把备份在栈上的内容写回寄存器。由于涉及到了寄存器级别的操作,我们需要用汇编来实现。 而对于如何保存在栈上,我们可以直接令 sp 栈寄存器直接减去相应需要开辟的大小,然后依次放在栈上。需要注意的是,

  • 我有一个HomeActivity,我从中调用片段列表。在HomeActivity中,我有一个侧菜单,其中加载了所有片段。 现在,在这个列表中,我有一个名为HomeFraank的片段,它使用webservice显示带有数据的Google地图。 我想要的是我想加载Map dat只加载一次(第一次)片段,而不是每次单击sidemenu或从任何其他片段进来时。 我的HomeFragment或任何其他片段会

  • 我有一个ViewPager有3个碎片绑定在FragmentPagerAdapter在一个FragmentActivity中,当我切换到不同的应用程序,回到我的应用程序后,或者在一个输入调用后,碎片没有恢复到以前的状态,一个碎片完全消失了,一些碎片按钮点击不工作..但在模拟器中它的工作很好 帮帮我吧...

  • 我试图理解在导航选项卡中使用片段时如何保持片段视图状态。在我的努力中,我遇到了两个我找不到合适解决方案的问题。 我有两个选项卡,Tab1和Tab2。Tab1的布局由碎片A定义,Tab2的布局由碎片B定义。我遵循了这里给出的方法(编辑:自从提出这个问题以来,文档已经发生了变化)。 第一个问题:即使我的视图有ID,当片段被重新附加时(在选项卡切换旋转之后),它们的状态也不会完全恢复。特别是:具有ID的