1

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

问题

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

4

2 回答 2

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) {
    }
}

这就是你所需要的。

于 2013-01-03T03:54:11.440 回答
0

public static boolean started我通过在每个片段中使用一个值来解决它。在每个片段的类中,在onCreateView()I setstarted = true;onDestroyView()I set我的主要活动started = false;

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

于 2013-01-03T01:55:21.557 回答