首先,我已经搜索并发现了很多类似的问题,例如我正在经历的,但是,我尝试了解决方案发布在那里,没有人为我工作。Xamarin.Android片段保留数据,但方向变化后重叠
我遇到的问题是,每当我从标签切换到标签,然后旋转设备,有一个片段重叠选定的一个。
这里是我使用的代码。让我知道是否需要更多信息。
活动:
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个选项卡)收集,摘要包含一些重要信息,如经理,主管等,并根据下一个选项卡上的数据进行一些计算。外部和内部包含许多控件,如EditTexts,RadioButtons等。
信息或数据不会立即保存,有时甚至不保存(不需要)。这是因为用户很多时候会捕获标签1中的一些数据,然后切换到标签3,然后切换到标签2,再次切换到标签1等等。正如我所说的,偶尔只是为了获得一些对于保存没有用处的标签1(摘要)中计算出来的快速信息。
这就是在更改标签页时不需要销毁数据的原因,因此使用了“隐藏和显示”。
我知道我可以使用各种方法临时存储信息,但它确实有很多信息(如给出示例中的选项卡3中的大约180个变量)。我来到的最实用和最简单的方法是避免重新创建碎片。
无论如何,考虑到这些信息,我可以得到一些关于如何避免重叠的建议,同时在切换时保留存储在这些碎片中的信息?
我真的很感谢帮助,提前致谢!