应用程序重启时的空白片段

时间:2013-01-03 00:58:03

标签: android android-fragments

每当我第一次打开我的应用程序时,我的xml文件中有3个容器中正确显示了三个片段。单击操作栏上的选项卡后,其中一个容器的片段将换成另一个。

问题

每当我打开应用程序时,切换到第二个选项卡,使用后退箭头退出应用程序,然后重新打开应用程序并重新选择第二个选项卡,片段为空白。没有出现,第三个选项卡也出现同样的问题。为什么不显示第二个和第三个片段?

2 个答案:

答案 0 :(得分:1)

// from onCreate() method of your DefaultActivity class, call this method:

// file: DefaultActivity.java

...
...
...
    private void addTabs() {
        // get support ActionBar and set navigation mode to Tabs
        ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Add first tab to ActionBar, and set the TabListener to a new TabListner object
        String title1 = "first_tab";
        ActionBar.Tab tab1 = bar.newTab();
        tab1.setText(title1);
        tab1.setTabListener(new TabListener(this, title1, Fragment1.class));
        bar.addTab(tab1);

        // Add second tab to ActionBar, and set the TabListener to a new TabListner object
        String title2 = "second_tab";
        ActionBar.Tab tab2 = bar.newTab();
        tab2.setText(locationsTitle);
        tab2.setTabListener(new TabListener(this, tab2, Fragment2.class));
        bar.addTab(tab2);

        // Add third tab to ActionBar, and set the TabListener to a new TabListner object
        String title3 = "third_tab";
        ActionBar.Tab tab3 = bar.newTab();
        tab3.setText(title3);
        tab3.setTabListener(new TabListener(this, title3, Fragment3.class));
        bar.addTab(tab3);
    }
... 
...
...

现在,您需要创建三个片段 - Fragment1,Fragment2和Fragment3以及创建TabListener:

// file: TabListener.java

public class TabListener implements ActionBar.TabListener {

    private final FragmentActivity mActivity;
    private final String mTag;
    private final Class mFragmentClass;
    private Fragment mFragment;

    public TabListener(FragmentActivity activity, String tag, Class fragmentClass) {
        mActivity = activity;
        mTag = tag;
        mFragmentClass = fragmentClass;
        // see if we already have the fragment with given tag. it's okay if it is null
        mFragment = activity.getSupportFragmentManager().findFragmentByTag(tag);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            // instantiate a new fragment for the given class
            mFragment = SherlockFragment.instantiate(mActivity, mFragmentClass.getName());
            // place in the default root viewgroup - android.R.id.content
            ft.replace(android.R.id.content, mFragment, mTag);
        } else {
            if (mFragment.isDetached())
                ft.attach(mFragment);
        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
    }
}

这就是你所需要的一切。

答案 1 :(得分:0)

我通过在每个片段中使用public static boolean started值来解决它。在每个片段的课程中,onCreateView()我设置started = true;onDestroyView()我设置started = false;

onTabSelected()方法中在我的主要活动中,我读了这个boolean值,如果它是true,我将片段附加回其容器,但如果它是false,我创建一个新的实例特定片段并将其添加到容器中。