【问题标题】:Android fragment -- OnDestroy being called when switching to a different tab followed by OnCreate when returning to the tab?Android片段-切换到另一个选项卡时调用OnDestroy,然后返回选项卡时调用OnCreate?
【发布时间】:2014-06-18 01:55:02
【问题描述】:

我有一个选项卡式 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);
}

【问题讨论】:

  • 你能贴一些标签切换发生的代码

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


【解决方案1】:

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

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

如您所见,您只使用一种布局 (Resource.Id.fragmentContainer) 来替换片段,因此它在您更改选项卡并释放替换片段的内存后重新使用它,从而调用onDestroy

【讨论】:

  • @WilliamJockusch Android 的架构是,是...... nm
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多