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

Android导航选项卡:恢复片段视图状态

章兴发
2023-03-14

我试图理解在导航选项卡中使用片段时如何保持片段视图状态。在我的努力中,我遇到了两个我找不到合适解决方案的问题。

我有两个选项卡,Tab1和Tab2。Tab1的布局由碎片A定义,Tab2的布局由碎片B定义。我遵循了这里给出的方法(编辑:自从提出这个问题以来,文档已经发生了变化)。

第一个问题:即使我的视图有ID,当片段被重新附加时(在选项卡切换旋转之后),它们的状态也不会完全恢复。特别是:具有ID的编辑文本确实会保存其输入的文本,但不会保存其启用状态。此外,即使按钮具有ID,如果按钮处于启用或禁用状态,也不会保存。我找到了两种解决此问题的可能方法:

  1. 切换选项卡时,请使用隐藏()/显示()而不是附加()/分离()

第二个问题:考虑以下用户交互:用户从Tab1开始并进行一些更改,使Tab1的视图状态与其默认状态不同(我们希望片段通过选项卡切换和设备倾斜来保存此视图状态)。然后用户转到Tab2。然后用户倾斜她/他的设备(仍然在Tab2)。然后用户切换到Tab1(在新的屏幕方向)。现在,问题是:当用户最初从Tab1切换到Tab2时,片段被分离,从而丢弃其视图(即使片段实例仍然存在)。当用户然后倾斜设备时,活动——从而与之关联的FragmentAFragmentB——都会被破坏。由于FragmentA此时不再有视图(请记住:它已被分离),因此我们无法在调用FragmentA. onSaveInstanceState(Bundle savedInstanceState)期间保存其视图元素的状态(例如,启用/禁用了哪些按钮)。在这种情况下如何恢复片段视图状态?将每个视图元素的不同状态标志保存为SharedPreVP的唯一可行解决方案吗?对于这样的“日常工作”来说,这似乎太复杂了。

共有2个答案

乔鸿骞
2023-03-14
private ViewPager viewPager;
viewPager = (ViewPager) findViewById(R.id.pager);
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
淳于昊然
2023-03-14

问题1:

默认情况下,Android不会保存您的视图启用状态。似乎只保存了直接受用户操作影响的内容(没有其他代码)。对于普通视图,不保存任何信息,对于EditText是其子类的TextView,将保存输入的文本(如果设置了冻结文本)。

如果您想保存任何其他内容,您必须自己完成。这里有一个问题,其中包含一些答案,展示了如何实现自定义视图状态保存。如果您遵循这种方法,您可以坚持附加/分离。

问题2:

你在那个片段中是对的。在视图已被销毁后,可以调用onSaveInstanceState(Bundle)。但是,这不是您应该保存视图状态的地方。Android将调用View。onSaveInstanceState()在分离片段时,它会破坏您的视图。它保存此状态,并在您再次附加片段时将其返回给您。这正是当您在选项卡之间翻转时发生的情况,通常没有旋转。碎片分离时不调用onSaveInstanceState(捆绑)。即使旋转设备,由于分离而保存的视图状态也将保持不变。如果实现视图。onSaveInstanceState()如上所述,即使在Tab1-Tab2-rotate-Tab1场景中,视图状态也会正确保存和恢复。

旁注:当您尝试旋转时,文档中的示例代码似乎有一些问题。TabListener的生存期与活动的生存期相同-每次旋转时都会创建一个新的生存期。这意味着每次旋转时,它也会丢失对片段的内部引用。添加的片段会自动重新创建,因此TabListener无需在旋转后尝试创建新实例并添加它。相反,它应该在片段管理器中找到具有适当标记的片段,而不是内部引用。旋转后,它仍将存在。

另一个问题是未保存所选选项卡,但在示例底部已指出这一点。您可以将其保存在活动中。onSaveInstanceState(捆绑)。

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

  • 我试图探索Android框架是如何管理碎片的,通过我的研究,我了解了很多关于碎片的新知识,但我有一次陷入了困境,无法理解这是如何发生的。 请先试着理解我的场景。它是这样的:我有一个活动,一个接一个地添加两个片段。首次加载活动时,使用以下代码将片段A附加到该活动: 片段A的这些回调方法在加载时被调用 FirstDummyFragment:onCreate:savedInstanceState---

  • 我正在尝试在我的android应用中实现一个选项卡导航,但是我想在每个选项卡中运行一个不同的activity。我一直在读android开发页面,他们坚持使用片段导航活动。根据我的理解,你不能有一个片段类本身,它必须包含在一个activity中。 是否可以为每个选项卡创建一个新的activity,并在onTabSelected()函数中运行该activity,同时从正在运行的activity中的片段

  • 我有底部的导航栏,点击导航栏中的项目,我正在替换片段。我有3个片段A、B、C,所以点击B项B片段被加载,在B中我调用3-4个API。所以现在如果我转到C,然后再次转到B,将创建一个新的B片段实例,并再次调用这些API,那么如何保存片段实例状态,并且在更改片段时不再调用API。这是我的密码。 我已经在MainActivity的onCreate中初始化了上面的片段成员变量

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

  • 我目前正在为我的Android应用程序使用导航抽屉。在我的第一个片段中,有一个片段使用Facebook的Graph API加载数据。因此,当我的应用程序第一次加载时,它首先进入第一个片段。 然后,我使用导航抽屉单击另一个片段并查看它。 最后,我重用导航抽屉返回第一个片段并查看它。 我面临的问题是,我如何继续利用已经创建过一次的片段,而不是在选择导航抽屉项时重新创建它。我的片段切换代码如下所示。 我