2014-06-18 5 views
2

탭이있는 Android 앱이 있습니다. 탭에서 벗어나면 OnDestroy가 해당 단편을 호출 한 것을 볼 수 있습니다. 내가 그 탭으로 돌아 왔을 때, OnCreate가 동일한 절편 객체를 호출하는 것을 볼 것입니다. 그것은 분명히 같은 객체이며, 같은 클래스의 다른 인스턴스는 아닙니다. 다른 탭으로 전환하면 OnDestroy가 다시 호출되고 그 탭으로 돌아 가면 OnCreate에 대한 세 번째 호출이 이어집니다.Android 조각 - 다른 탭으로 전환 할 때 OnDestroy가 호출되고 탭으로 돌아갈 때 OnCreate가 호출됩니까?

Android docs에 이런 일이 있어서는 안됩니다.

이것은 내 응용 프로그램의 아키텍처 문제를 나타내는 것입니까? 관련성이있는 경우 Mono를 사용하고 OnActivityCreated에서 RetainInstance를 true로 설정합니다.

EDIT : 아래 코드는 모든 탭을 감싸는 활동의 코드입니다. 이 때문에 조각을 교체하기위한 당신이 하나 개의 레이아웃 (Resource.Id.fragmentContainer)를 사용하는 것을 볼 수대로 조각마다 교체되기 때문에

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()); 

변경 탭을 변경하고 대체 된 조각의 메모리를 해제 한 후이를 다시 사용하여 onDestroy을 호출합니다.

+0

예, 불량 아키텍처로 보입니다. 감사. –

+0

@WilliamJockusch 안드로이드의 아키텍처는 ... nm – samosaris

관련 문제