怎么了?
快速浏览完的代码后
ActionBarActivity,似乎实现了
ICS及以上部分的错误
ActionBar(该代码应适用于前置
ICS设备),该错误也需要注意这些选项卡。
在
ActionBarImplICS代表
ICS设备实现的类中,
FragmentTransaction传递给
onTabUnselected()回调的方法似乎完全没有用,因为它没有在侦听器的回调返回之后的任何地方提交(事务针对的其他两个回调而提交
TabListener)。因此,提交的片段将永远不会与选项卡上的布局分离,并且它将保持获取重叠的内容(由于
frameLayout包含两个片段)。
我编写了该
TabListener接口的另一种实现,该接口的全部工作仅由不受上述bug(
onTabSelected())影响的一个回调完成:
public class TabListenerImpl implements ActionBar.TabListener { private List<TabInfo> mTabs = new ArrayList<TabInfo>(); private Context mContext; public TabListenerImpl(Context context) { mContext = context; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // iterate over all of the tabs, match the tag we have and see if // we also have a fragment instance for it. If we don't, create one // and add it to the container, if we have an instance simply attach // it. Detach every other tag which doesn't match the tag. for (TabInfo t : mTabs) { if (tab.getTag() == t.tag) { if (t.pageFragment == null) { t.pageFragment = Fragment.instantiate(mContext, t.clazz.getName()); ft.add(android.R.id.content, t.pageFragment, t.tag); } else { ft.attach(t.pageFragment); } } else { if (t.pageFragment != null && !t.pageFragment.isDetached()) { ft.detach(t.pageFragment); } } } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // faulty method } public void addTab(String tag, Class<? extends Fragment> clazz) { TabInfo ti = new TabInfo(); ti.clazz = clazz; ti.tag = tag; mTabs.add(ti); } // wrapper class private class TabInfo { Class<? extends Fragment> clazz; Fragment pageFragment; String tag; }}然后可以将其用作:
TabListenerImpl listener = new TabListenerImpl(this);Tab tab = actionBar.newTab().setText("TAB1").setTag("TAB1").setTabListener(listener);listener.addTab("TAB1", Tab1Class.class);actionBar.addTab(tab);tab = actionBar.newTab().setText("TAB2").setTag("TAB2").setTabListener(listener);listener.addTab("TAB2", Tab2Class.class);actionBar.addTab(tab);我建议您将容器设置为内容视图(以及标签内容),而不要使用该
android.R.id.content容器。请记住,我的实现没有考虑配置更改。



