Actionbarsherlock +标签+多片段?
我很努力地得到actionbarsherlock +标签+片段的工作。
我只能使这个设置为静态工作,我想创build这个像android市场应用程序(滑动运动)。
当你需要膨胀内部多片段的布局时,我会卡住。
在Support4demos中,我以FragmentsTabsPager为例。
你需要合适的库来实现你想要的。
基本上, ViewPager
库是你所缺less的。 我的build议:
1. ActionbarSherlock
这是非常简单的工作,我不会解释它。
2. ViewPagerExtensions
你可以在这里find它。 下载ZIP文件并从中创build一个新项目。
我只能使这个设置为静态工作,我想创build这个像android market app(swype movement)。
从这个项目实现com.astuetz.viewpager.extensions.SwipeyTabsView
。 有一些易于遵循的例子。 它确实是你想要的。 甚至还有其他选项卡样式可供select(包括ICS附带的新“人员”选项卡)。 此外,它很容易风格来匹配你的应用程序的身份。
3. FragmentPagerAdapter
最后,从支持库(v4)的那个类。
祝你好运,并可以自由地问我是否需要更多的帮助。
如果你使用我build议的,你不需要重写FragmentPagerAdapter
instantiateItem
。 你只需要
- 为构造函数提供一个
FragmentManager
并调用超级实现; - 重写
getCount
来返回你的寻呼机中的片段数 -
getItem
, 这是你将用来返回你的片段创build。
这是我在这里的代码(一个完整的工作,生产示例)的例子。 这是实现寻呼机的活动的内部类:
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; } }
正如你所看到的,这个寻呼机处理两个“页面”,左边显示销售数据。 正确的一个允许用户select哪个部门。 这些都是在getItem
方法中返回的。 正确的碎片(你可以使用你已经有的碎片,不需要修改)。
正如所料,通过1)创build一个实例化MyFragmentPagerAdapter
的对象,2)将适配器设置为ViewPager
对象,使其成为您刚刚实例化的类。 正如你所看到的,它的getItem
方法将“给”寻呼机所有你需要的片段。 例:
mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mFragmentPagerAdapter);
当然,还有其他的事情要做,比如自己创build标签button,join所有这些来交叉沟通。 我build议看一下从GitHub下载的ViewPagerExtensions ZIP文件中提供的示例。 这只是您评论中问题的答案。 正如你所看到的,使用这个库的代码并不多。
我实际上设法使这个工作没有任何比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);
这会给你带来可爱的“swipey tab”效果,就像你所说的那样,ABS,支持库和片段。 ABS确实使这与使用本地库几乎相同。 我实际上直接从谷歌分页标签的例子复制这段代码,并修改它曾经有点ABS。
希望这可以帮助!
很多示例通常会抛出一个exception( IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
当切换回先前selectIllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
时, IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
。
我喜欢将Google的示例与FragmentStatePageAdapter
相适应,而不是使用普通的FragmentPageAdapter
,它将replace您的碎片并解决此错误。 通常这会破坏它认为可以被移除的碎片以节省空间; 用一个空的块覆盖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合作良好,实施相对简单。