Android片段 - 在切换到其他选项卡时调用OnDestroy,然后在返回选项卡时使用OnCreate?

时间:2014-06-18 01:55:03

标签: android android-fragments tabs mono xamarin.android

我有一个标签式Android应用。当我从标签切换时,我看到OnDestroy要求相应的片段。当我回到那个标签时,我看到OnCreate要求相同的碎片对象。它绝对是同一个对象,而不是同一个类的另一个实例。如果我切换到另一个选项卡,再次调用OnDestroy,如果我返回到该选项卡,则第三次调用OnCreate,依此类推。

Android docs似乎表明不会发生这种情况。

这是否表明我的应用存在架构问题?如果它是相关的,我使用的是Mono,我在OnActivityCreated中将RetainInstance设置为true。

编辑:下面的代码来自包装所有标签的活动。

protected override void OnCreate(Bundle bundle) {
  base.OnCreate(bundle);
  MainContext mainContext = MainContext;
  TabContext tabContext = mainContext.TabContext;
  // Tab is a custom model object; not related to Android tabs.
  List<Tab> tabs = tabContext.Tabs;
  foreach (Tab tab in tabs) {
    string displayString = tab.DisplayString;
    string withUnderscores = displayString.Replace(' ', '_');
    Type fragmentType = Type.GetType(Assembly.GetExecutingAssembly().GetName().Name + "." + withUnderscores + "Fragment");
    this.AddTab(tab, (Fragment) Activator.CreateInstance(fragmentType));
  }
  ActionBar bar = this.ActionBar;
  bar.NavigationMode = ActionBarNavigationMode.Tabs;
  bar.SetDisplayShowTitleEnabled(false);
  bar.SetDisplayShowHomeEnabled(false);
  SetContentView(Resource.Layout.MainTabActivityLayout);

  if (bundle != null) {
    int index = bundle.GetInt("index");
    ActionBar.SetSelectedNavigationItem(index);
  }
}

private void AddTab(Tab tab, Fragment fragment) {
  ActionBar bar = this.ActionBar;
  Android.App.ActionBar.Tab droidTab = bar.NewTab();


  droidTab.SetTag(tab.ToString());
  // omitting code that sets icon and display text.
  droidTab.TabSelected += (sender, e) => {
    e.FragmentTransaction.Replace(Resource.Id.fragmentContainer, fragment, tab.ToString());
  };

  this.ActionBar.AddTab(droidTab);
}

1 个答案:

答案 0 :(得分:2)

它正在调用onDestroy,因为每次更改选项卡时都要替换片段

e.FragmentTransaction.Replace(Resource.Id.fragmentContainer, fragment, tab.ToString());

正如您所看到的那样,您只使用一个布局(Resource.Id.fragmentContainer)来替换片段,因此在更改制表符并释放替换片段的内存后重新使用它,从而调用onDestroy