2014-09-23 77 views
0

首先,我已经搜索并发现了很多类似的问题,例如我正在经历的,但是,我尝试了解决方案发布在那里,没有人为我工作。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个变量)。我来到的最实用和最简单的方法是避免重新创建碎片。

无论如何,考虑到这些信息,我可以得到一些关于如何避免重叠的建议,同时在切换时保留存储在这些碎片中的信息?

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

回答

0

好,看着一遍又一遍后,我最终实现ActionBar.Tab与ViewPager组合像所示:

HelloSwipeViewWithTabs

和设置OffscreenPageLimit为2的值保持数据3个选项卡。

其结果与我刚刚通过一个很好的轻扫功能轻松浏览碎片非常相似。