我有一个使用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
。我的问题是,当选择除第一个之外的选项卡时,片段内的内容不会显示。从碎片初始化时的原木开始,我可以看出正在创建的视图没有被显示,它只是一个显示背景的空白区域。
答案 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);