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

片段如何恢复其视图状态?

周超英
2023-03-14

我试图探索Android框架是如何管理碎片的,通过我的研究,我了解了很多关于碎片的新知识,但我有一次陷入了困境,无法理解这是如何发生的。

请先试着理解我的场景。它是这样的:我有一个活动,一个接一个地添加两个片段。首次加载活动时,使用以下代码将片段A附加到该活动:

private void initFirstFragment(){
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW", "FIRST ACTIVITY\nFIRST DUMMY FRAGMENT");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, FirstDummyFragment.newInstance(bundle), FirstDummyFragment.class.getSimpleName());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

片段A的这些回调方法在加载时被调用

FirstDummyFragment:onCreate:savedInstanceState---

FirstDummyFragment:onCreateView:savedInstanceState---

FirstDummyFragment:onResume

现在在片段A中,我有一个编辑文本,我在其中键入了一些文本。

当在活动内单击按钮时,使用以下代码将片段B添加到同一容器中:

public void openSecondFragment() {
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW", "FIRST ACTIVITY\nSECOND DUMMY FRAGMENT");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, SecondDummyFragment.newInstance(bundle), SecondDummyFragment.class.getSimpleName());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

在添加片段B后调用以下回调方法

SecondDummyFragment:onCreate:savedInstanceState---

FirstDummyFragment:onDestroyView

第二个问题

SecondDummyFragment:onResume

当我按下后退按钮时,片段B被销毁,片段A出现在前台,下面调用回调方法

SecondDummyFragment:onDestroyView

第二个问题

第二段:onDetach

FirstDummyFragment:onCreateView:savedInstanceState---

FirstDummyFragment:onResume

片段A的编辑文本包含与我在添加片段B之前输入的相同的文本。我很困惑Android如何恢复片段A的视图状态,即使savedInstanceState为null,并且当再次创建片段A时,onCreateView返回一个全新的视图对象。

共有1个答案

充修能
2023-03-14

最后我在这里找到了答案。

Android就是这样设计的。在这种情况下,视图状态保存/恢复在Fraank内部调用。因此,在内部实现视图状态保存/恢复的每个视图,例如EditText或TextView with android: freezeText="true",将自动保存和恢复状态。使其显示与之前完全相同。

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

  • 我试图做恢复片段视图状态值(文本视图,... 我的活动。Java语言 ProductFragment。Java语言 在ProductFragment中,我将向文本视图添加值。当我从ReportFragment开始时,视图值将在ProductFragment中清除。

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

  • 视图(在本例中,ViewPager)有自己的保存和恢复状态的实现,我依靠它在设备旋转后将ViewPager保持在同一页面上。 当ViewPager在活动中时,它工作得非常好。我滚动到一个页面,旋转设备,它仍然在那个页面上。在SaveInstanceState中不需要任何代码。 我已经把那个活动转化成了一个片段。现在,ViewPager无法保持其状态!如果我滚动到一个页面并旋转设备,它会返回到第1页

  • 我创建了一个全新的项目来展示我的问题。基本上,我的片段有两个。在使用CreateView时,我总是使用。但是,如果我检查,然后通过按后退按钮向外导航,下次打开它时,它会自动检查。那种行为打破了我的逻辑。 MainActivity.java weirdfragment.java 因此,我可以看到它是onRestoreInstanceState检查我的。但我不知道如何预防。我正在考虑的事情: 在OnV

  • 在需要动态添加和从viewpager中删除列表片段的应用程序中工作,当点击列表中的一个项目时,新的片段会添加到viewpager中,当需要删除swipe back片段时,这工作效果很好,但当我旋转屏幕时,页面中的片段会有两个实例,再旋转一次,实例会增加四倍。 同时,我需要持久化片段的状态(列表位置、加载的项数等),这意味着重写片段中的onsaveinstancestate并将相关数据保存在捆绑包中