我非常努力地让动作栏夏洛克+标签+片段工作。
我只能使此设置作为静态工作,我想创建像安卓市场应用程序(滑动移动)一样
。当您需要给内部包含多个片段的布局充气时,我就会卡住。
在Support4demos中,我得到了FragmentsTabsPager作为示例。
我实际上设法让它工作,除了 ABS 库和支持库之外,没有任何东西。 这是我的代码:
public class ActionBarTabs extends SherlockFragmentActivity {
CustomViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mViewPager = new CustomViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText("Home"),
ToolKitFragment.class, null);
mTabsAdapter.addTab(bar.newTab().setText("FujiSan"),
FujiFragment.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(),
info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
您可以根据以下内容加载选项卡内容。
mTabsAdapter.addTab(bar.newTab().setText("Home"),
YOURFRAGMENTHERE.class, null);
这将为您提供可爱的"滑动选项卡"效果,正如您所指的,带有ABS,支持库和片段。 ABS 确实使这几乎与使用本机库相同。 我实际上直接从Google的分页选项卡示例中复制了此代码,并为ABS对其进行了轻微修改。
希望这有帮助!
您需要正确的库来实现所需的内容。
基本上,ViewPager
库是您缺少的。我的建议:
1.动作栏夏洛克
这太容易了,我就不解释了。
2. 查看寻呼扩展
你可以在这里找到它。下载 ZIP 文件并从中创建新项目。
我只能使这组设置为静态工作,我想创建这个像安卓市场应用程序(swype 运动)。
从此项目中实现com.astuetz.viewpager.extensions.SwipeyTabsView
。有一些易于遵循的示例。它完全符合您的要求。甚至还有其他选项卡样式可供选择(包括 ICS 附带的新"人员"选项卡)。此外,很容易设置其样式以匹配您的应用程序标识。
3. FragmentPagerAdapter
最后,支持库 (v4) 中的该类。
祝你好运,如果你需要更多帮助,请随时问我。
如果您使用的是我的建议,则无需覆盖FragmentPagerAdapter
中的instantiateItem
。你只需要
- 为构造函数提供
FragmentManager
并调用超级实现; - 覆盖
getCount
以返回寻呼机中的片段数,以及 -
getItem
,这是您将用来返回片段以进行创建的内容。
这是我在这里的代码示例(一个完整的工作生产示例)。它是实现寻呼机的活动的内部类:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int position) {
Fragment f;
switch(position) {
case 0:
f= new ItemSalesDataFragment();
break;
case 1:
f= new DepartmentChooserFragment();
break;
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
return f;
}
}
如您所见,此寻呼机处理两个"页面",左侧显示销售数据。正确的一个允许用户选择哪个部门。这些在 getItem
方法中返回。正确的片段(您可以使用已有的任何片段,无需修改)。
正如预期的那样,您将所有这些连接在一起:1) 创建一个实例化 MyFragmentPagerAdapter
的对象,以及 2) 将适配器设置为您刚刚实例化的那个类ViewPager
对象。如您所见,它的getItem
方法将"提供"寻呼机所需的所有片段。例:
mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
当然,还有其他事情要做,比如自己创建选项卡按钮并加入所有这些以进行交叉通信。我建议查看从GitHub下载的ViewPagerExtensions ZIP文件中提供的示例。这只是您评论中问题的答案。如您所见,使用此库的代码并不多。
许多示例在切换回先前选择的选项卡时通常会抛出异常(IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
)。
我喜欢用FragmentStatePageAdapter
而不是普通的FragmentPageAdapter
来改编谷歌的例子,这将为您替换片段并解决此错误。通常,这将销毁它认为可以删除以节省空间的碎片;如果您想始终保留片段,请用空块覆盖destroyItem(ViewGroup, int, Object)
。
下面是一个示例:
public class ActionBarTabs extends SherlockFragmentActivity {
CustomViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
ActionBar mActionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mViewPager = new CustomViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
mActionBar = getSupportActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 1"),
YOURFRAGMENT_A.class, null);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 2"),
YOURFRAGMENT_B.class, null);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 3"),
YOURFRAGMENT_C.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext,
info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
与 ABS 配合良好,实现起来相对简单。