简体   繁体   中英

OnCreate of the replaced Fragment is called Twice. Why?

I am using Fragments as Tabs in my application in an Activity that is extended from FragmnetActivity . I am able to add initial Fragments and then on the basis of my application settings, I am replacing fragments. When I am in the debug mode, I observe that, onCreate and other overriden methods of the very new fragmnet are being called twice. Why so? and How can I restrict them to be called once only.

Following is the way I am using Fragments in my app:

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

Any help is appreciated. Thanks!

I use show() and hide() instead, and it works well.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM