首先,我搜索并发现了很多类似的问题,比如我正在经历的问题,然而,我尝试了发布在那里的解决方案,但没有一个对我有效。
我遇到的问题是,每当我从一个选项卡切换到另一个选项卡,然后旋转设备时,都会有一个片段与所选的片段重叠。
这是我正在使用的代码。如果需要更多信息,请告诉我。
活动:
public class SupervisionDetailsActivity : Activity, ActionBar.ITabListener
{
private enum TabType { Summary, Data1, Data2 }
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.SupervisionDetails);
ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
AddTab("Summary", TabType.Summary);
AddTab("External", TabType.Data1);
AddTab("Internal", TabType.Data2);
}
private void AddTab(string label, TabType type)
{
var tab = ActionBar.NewTab();
tab.SetTag(type.ToString());
tab.SetText(label);
tab.SetTabListener(this);
ActionBar.AddTab(tab);
}
public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft)
{
var f = FragmentManager.FindFragmentByTag(tab.Tag.ToString());
switch (tab.Position)
{
case 0:
if (f != null)
ft.Show(f);
else
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsSummary(), TabType.Summary.ToString());
break;
case 1:
if (f != null)
ft.Show(f);
else
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData1(), TabType.Data1.ToString());
break;
case 2:
if (f != null)
ft.Show(f);
else
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData2(), TabType.Data2.ToString());
break;
default:
break;
}
}
public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft)
{
}
public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft)
{
var f = FragmentManager.FindFragmentByTag(tab.Tag.ToString());
ft.Hide(f);
}
protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
// Save selected tab
outState.PutInt("tab", ActionBar.SelectedNavigationIndex);
}
protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
base.OnRestoreInstanceState(savedInstanceState);
// Restore selected tab
int saved = savedInstanceState.GetInt("tab", 0);
if (saved != ActionBar.SelectedNavigationIndex)
ActionBar.SetSelectedNavigationItem(saved);
}
}
如果我更换这些线路:
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsSummary(), TabType.Summary.ToString());
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData1(), TabType.Data1.ToString());
ft.Add(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData2(), TabType.Data2.ToString());
其中:
ft.Replace(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsSummary(), TabType.Summary.ToString());
ft.Replace(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData1(), TabType.Data1.ToString());
ft.Replace(Resource.Id.fragmentContainer, new FragmentSupervisionDetailsData2(), TabType.Data2.ToString());
重叠问题消失了,但碎片中的数据/信息丢失了,这不是我想要的。
现在,让我解释一下为什么数据保存很重要。
第一次创建碎片时,没有任何信息(除非从数据库中提取)。
信息从3个地方(3个选项卡)收集,摘要包含一些小但重要的信息,如经理、主管等,并根据下一个选项卡上的数据进行一些计算。外部和内部包含许多控件,如编辑文本、单选按钮等。
信息或数据不会立即保存,有时甚至不会保存(不需要保存)。这是因为很多时候,用户在选项卡1中捕获一些数据,然后切换到选项卡3,然后切换至选项卡2,再切换至选项卡1,依此类推。正如我所说,偶尔只是为了在选项卡1(摘要)中获得一些快速计算的信息,这对保存没有用处。
这就是在更改选项卡时不需要销毁数据的原因,因此使用了隐藏和显示。
我知道我可以使用各种方法临时存储信息,但这实际上是一个很大的信息(例如选项卡3中的大约180个变量)。我找到的最实用、最简单的方法是避免重新创建碎片。
不管怎样,考虑到这些信息,我能得到一些建议吗?如何避免重叠,同时在切换碎片时保留存储在碎片中的信息?
我真的很感激你的帮助,提前谢谢!
好吧,经过一次又一次的研究,我终于实现了ActionBar.Tab和ViewPager的组合,如下所示:
Hello带选项卡的窗口
并将"偏移屏幕页面限制"设置为值2,以保持3个选项卡的数据。
结果与我刚才使用的非常相似,只是使用了一个很好的滑动功能,可以轻松浏览碎片。