我试图理解在导航选项卡中使用片段时如何保持片段视图状态。在我的努力中,我遇到了两个我找不到合适解决方案的问题。
我有两个选项卡,Tab1和Tab2。Tab1的布局由碎片A定义,Tab2的布局由碎片B定义。我遵循了这里给出的方法(编辑:自从提出这个问题以来,文档已经发生了变化)。
第一个问题:即使我的视图有ID,当片段被重新附加时(在选项卡切换旋转之后),它们的状态也不会完全恢复。特别是:具有ID的编辑文本确实会保存其输入的文本,但不会保存其启用状态。此外,即使按钮具有ID,如果按钮处于启用或禁用状态,也不会保存。我找到了两种解决此问题的可能方法:
第二个问题:考虑以下用户交互:用户从Tab1开始并进行一些更改,使Tab1的视图状态与其默认状态不同(我们希望片段通过选项卡切换和设备倾斜来保存此视图状态)。然后用户转到Tab2。然后用户倾斜她/他的设备(仍然在Tab2)。然后用户切换到Tab1(在新的屏幕方向)。现在,问题是:当用户最初从Tab1切换到Tab2时,片段被分离,从而丢弃其视图(即使片段实例仍然存在)。当用户然后倾斜设备时,活动——从而与之关联的FragmentA
和FragmentB
——都会被破坏。由于FragmentA
此时不再有视图(请记住:它已被分离),因此我们无法在调用FragmentA. onSaveInstanceState(Bundle savedInstanceState)
期间保存其视图元素的状态(例如,启用/禁用了哪些按钮)。在这种情况下如何恢复片段视图状态?将每个视图元素的不同状态标志保存为SharedPreVP的唯一可行解决方案吗?对于这样的“日常工作”来说,这似乎太复杂了。
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) {
}
问题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加载数据。因此,当我的应用程序第一次加载时,它首先进入第一个片段。 然后,我使用导航抽屉单击另一个片段并查看它。 最后,我重用导航抽屉返回第一个片段并查看它。 我面临的问题是,我如何继续利用已经创建过一次的片段,而不是在选择导航抽屉项时重新创建它。我的片段切换代码如下所示。 我