2014-06-18 5 views
2

У меня есть приложение для Android с вкладками. Когда я переключаюсь с вкладки, я вижу, что OnDestroy вызвал соответствующий фрагмент. Когда я вернусь на эту вкладку, я увижу, что OnCreate вызвал ТО ЖЕ САМОГО ФРАГМЕНТА. Это, безусловно, тот же объект, а не другой экземпляр того же класса. Если я переключусь на другую вкладку, OnDestroy вызывается снова, а затем третий вызов OnCreate, если я вернусь на эту вкладку и так далее.Фрагмент Android - OnDestroy вызывается при переключении на другую вкладку, а затем OnCreate при возврате на вкладку?

Android docs, похоже, заявили, что этого не должно произойти.

Означает ли это архитектурную проблему с моим приложением? Если это актуально, я использую Mono, и я устанавливаю RetainInstance в true в OnActivityCreated.

EDIT: приведенный ниже код относится к деятельности, которая охватывает все вкладки.

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.

+0

да, хорошо, выглядит плохой архитектурой; Благодарю. –

+0

@WilliamJockusch Архитектура Android - это ... nm – samosaris

Смежные вопросы