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个选项卡)收集,摘要包含一些小但重要的信息,如经理、主管等,并根据下一个选项卡上的数据进行一些计算。外部和内部包含许多控件,如编辑文本、单选按钮等。

信息或数据不会立即保存,有时甚至不会保存(不需要保存)。这是因为很多时候,用户在选项卡1中捕获一些数据,然后切换到选项卡3,然后切换至选项卡2,再切换至选项卡1,依此类推。正如我所说,偶尔只是为了在选项卡1(摘要)中获得一些快速计算的信息,这对保存没有用处。

这就是在更改选项卡时不需要销毁数据的原因,因此使用了隐藏和显示。

我知道我可以使用各种方法临时存储信息,但这实际上是一个很大的信息(例如选项卡3中的大约180个变量)。我找到的最实用、最简单的方法是避免重新创建碎片。

不管怎样,考虑到这些信息,我能得到一些建议吗?如何避免重叠,同时在切换碎片时保留存储在碎片中的信息?

我真的很感激你的帮助,提前谢谢!

好吧,经过一次又一次的研究,我终于实现了ActionBar.Tab和ViewPager的组合,如下所示:

Hello带选项卡的窗口

并将"偏移屏幕页面限制"设置为值2,以保持3个选项卡的数据。

结果与我刚才使用的非常相似,只是使用了一个很好的滑动功能,可以轻松浏览碎片。

最新更新