我有一个标签式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);
}
答案 0 :(得分:2)
它正在调用onDestroy
,因为每次更改选项卡时都要替换片段
e.FragmentTransaction.Replace(Resource.Id.fragmentContainer, fragment, tab.ToString());
正如您所看到的那样,您只使用一个布局(Resource.Id.fragmentContainer
)来替换片段,因此在更改制表符并释放替换片段的内存后重新使用它,从而调用onDestroy