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

Android 在ActionBar.TabListener类中隐藏/显示SherlockFragments,内容为空,android,tabs,android-fragments,actionbarsherlock,Android,Tabs,Android Fragments,Actionbarsherlock,我有一个使用TabBarSherlock和支持库构建的应用程序,用于向3.0之前的设备添加ActionBar支持。我不记得我遵循了什么教程来创建选项卡和侦听器,但我有以下代码 首先在SherlockFragmentActivity中创建选项卡: 类TabFragment包含每个选项卡的ViewPager。我的问题是,当选择第一个选项卡以外的选项卡时,片段中的内容不会显示。从片段初始化时的日志中,我可以看出正在创建视图,只是没有显示,只是显示背景的空白区域 使用“附着”和“分离”,而不是使用“显示

我有一个使用TabBarSherlock和支持库构建的应用程序,用于向3.0之前的设备添加ActionBar支持。我不记得我遵循了什么教程来创建选项卡和侦听器,但我有以下代码

首先在SherlockFragmentActivity中创建选项卡:


类TabFragment包含每个选项卡的ViewPager。我的问题是,当选择第一个选项卡以外的选项卡时,片段中的内容不会显示。从片段初始化时的日志中,我可以看出正在创建视图,只是没有显示,只是显示背景的空白区域

使用“附着”和“分离”,而不是使用“显示和隐藏”。使用“显示/隐藏”不会从屏幕中删除视图层次结构,只是将其隐藏,因此可能存在与此相关的问题。

您并没有分离片段,而只是将其隐藏。因此,您应该分离它,以便在您的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;
    }
}
你选择的应该是这样的

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

选项卡栏上的内容为空,然后写下面的代码 最终ActionBar ActionBar=getActionBar;
actionBar.setNavigationModeactionBar.NAVIGATION_模式_标准

查看您的TabFragment类可能会有所帮助。我希望它只显示和隐藏这就是重点。分离和附加导致它必须重新创建片段中的所有图像,在我的例子中,这些图像对内存的影响非常大,并且会导致明显的延迟。尽管@SamRowley这样做有效吗?然后我们至少可以确定显示/隐藏是问题所在。
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;
    }
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }