【发布时间】: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