在ActionBar.TabListener类中隐藏/显示SherlockFragments,内容为空

时间:2013-09-06 08:58:12

标签: android tabs android-fragments actionbarsherlock

我有一个使用TabBarSherlock和支持库构建的应用程序,可以为3.0之前的设备添加ActionBar支持。我不记得我在创建Tabs和Listener时遵循的教程,但我有以下代码。

首先创建标签(在SherlockFragmentActivity中):

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

/*--------Setup News Tab--------*/
Tab tab1 = actionBar.newTab()
        .setText("News")
        .setTabListener(new TabListener<TabFragment>(
                        this, "tab1", TabFragment.class));
Bundle newsBundle = new Bundle();
newsBundle.putInt("news_id", newsID);
tab1.setTag(newsBundle);
actionBar.addTab(tab1);
/*------------------------------*/
// This is repeated 3 more times to total 4 Tabs.

然后我有一个classCalled TabListener,在每个标签中使用它来检测它们何时被选中。

public class TabListener<T extends Fragment> implements ActionBar.TabListener{
    private TabFragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialised
        if (mFragment == null) {
             Log.v("FRAGMENT", "FRAGMENT NEEDS TO BE CREATED");
             mFragment = (TabFragment) Fragment.instantiate(mActivity, mClass.getName(), (Bundle)tab.getTag());
             ft.add(android.R.id.content, mFragment, mTag);
        } else {
            Log.v("FRAGMENT", "FRAGMENT ALREADY CREATED");
            ft.show(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.hide(mFragment);
        }
    }

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

对于每个标签,类TabFragment包含ViewPager。我的问题是,当选择除第一个之外的选项卡时,片段内的内容不会显示。从碎片初始化时的原木开始,我可以看出正在创建的视图没有被显示,它只是一个显示背景的空白区域。

3 个答案:

答案 0 :(得分:0)

不使用show()hide(),而是使用attach()detach()。使用show / hide不会从屏幕上删除视图层次结构,只需隐藏它,因此可能存在与此相关的问题。

答案 1 :(得分:0)

你不是在分离片段而是隐藏它。因此,您应该将其分离,以便在onTabUnSelected

中附加其他片段

FragmentManager将自动恢复配置更改时当前显示的任何片段(和历史记录)。在创建和附加新实例之前,调用findFragmentByTag以查看目标片段的实例是否已存在。

示例:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

    // Check if the fragment is already initialized
    if (mFragment == null && preInitializedFragment == null) {
        // If not, instantiate and add it to the activity
        mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFragment, mTag);
    } else if (mFragment != null) {
        // If it exists, simply attach it in order to show it
        ft.attach(mFragment);
    } else if (preInitializedFragment != null) {
        ft.attach(preInitializedFragment);
        mFragment = preInitializedFragment;
    }
}

onTabUnSelected应该是这样的

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }

答案 2 :(得分:0)

标签栏上的内容为空,然后在代码下方写下 final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(actionBar.NAVIGATION_MODE_STANDARD);