1

我在我的應用程序中使用Fragments作爲從FragmnetActivity擴展的活動中的選項卡。我能夠添加初始碎片,然後根據我的應用程序設置,我正在替換碎片。當我處於調試模式時,我觀察到,onCreate和其他overriden方法的新fragmnet被稱爲兩次。爲什麼這樣?以及如何限制他們僅被調用一次。被替換片段的OnCreate被稱爲Twice。爲什麼?

以下是我使用的片段在我的應用程序的方式:

public class FragmentTabs extends FragmentActivity implements OnTabChangeListener { 

private FragmentTabHost mTabHost; 
private HomeFragment homeFragmnet; 
private GroupFragment groupFragment; 
private TemplateFragment templateFragment; 
private SetingsFragment settingsFragment; 
private CalendarViewFragment calendarViewFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

    setContentView(R.layout.fragment_tabs); 

    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 

    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

    homeFragmnet = new HomeFragment(); 
    groupFragment = new GroupFragment(); 
    templateFragment = new TemplateFragment(); 
    settingsFragment = new SetingsFragment(); 
    calendarViewFragment = new CalendarViewFragment(); 

    mTabHost.setOnTabChangedListener(this); 

    if (Database.getSharedObject(getApplicationContext()).getAppSettings().getListView() == 1) { 
     mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator("", getResources().getDrawable(R.drawable.home_tab)), HomeFragment.class, null); 

    } else { 
     mTabHost.addTab(mTabHost.newTabSpec("home").setIndicator("", getResources().getDrawable(R.drawable.home_tab)), CalendarViewFragment.class, null); 
    } 
    mTabHost.addTab(mTabHost.newTabSpec("groups").setIndicator("", getResources().getDrawable(R.drawable.groups_tab)), GroupFragment.class, null); 
    mTabHost.addTab(mTabHost.newTabSpec("templates").setIndicator("", getResources().getDrawable(R.drawable.templates_tab)),TemplateFragment.class, null); 
    mTabHost.addTab(mTabHost.newTabSpec("settings").setIndicator("", getResources().getDrawable(R.drawable.settings_tab)), SetingsFragment.class, null); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 

} 

private void showHomeFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.realtabcontent, homeFragmnet); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.disallowAddToBackStack(); 
    ft.commit(); 
} 

private void showGroupsFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.realtabcontent, groupFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.disallowAddToBackStack(); 
    ft.commit(); 
} 

private void showTemplateFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.realtabcontent, templateFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.disallowAddToBackStack(); 
    ft.commit(); 
} 

private void showSettingsFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.realtabcontent, settingsFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.disallowAddToBackStack(); 
    ft.commit(); 
} 

private void showCalendarViewFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.realtabcontent, calendarViewFragment); 
    ft.disallowAddToBackStack(); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

@Override 
public void onTabChanged(String arg0) { 

    if (mTabHost.getCurrentTab() == 0) { 
     if (Database.getSharedObject(getApplicationContext()).getAppSettings().getListView() == 1) { 
      showHomeFragment(); 
     } else { 
      showCalendarViewFragment(); 
     } 
    } else if (mTabHost.getCurrentTab() == 1) { 
     showGroupsFragment(); 
    } else if (mTabHost.getCurrentTab() == 2) { 
     showTemplateFragment(); 
    } else if (mTabHost.getCurrentTab() == 3) { 
     showSettingsFragment(); 
    } 
} 

任何幫助表示讚賞。謝謝!

回答

0

我使用show()和hide()來代替,它運行良好。

private void showHomeFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    if (homeFragmnet.isAdded()) 
     ft.show(homeFragmnet); 
    else 
     ft.add(R.id.realtabcontent, homeFragmnet); 

    if (groupFragment.isAdded()) ft.hide(groupFragment); 
    if (templateFragment.isAdded()) ft.hide(templateFragment); 
    if (settingsFragment.isAdded()) ft.hide(settingsFragment); 
    if (calendarViewFragment.isAdded()) ft.hide(calendarViewFragment); 

    ft.commit(); 
} 
+0

@ iForests ...我沒有使用Action Bar TabListener。我正在使用支持v4。 – 2013-03-21 11:38:27

+0

它仍然是調用方法2次。 – 2013-03-21 13:48:03