我已经非常努力地让 actionbarsherlock + 选项卡 + 片段工作。
我只能让这个设置作为静态工作,我想创建这个像 android 市场应用程序(滑动移动)。
当您需要为内部包含多个片段的布局充气时,我会卡住。
在 Support4demos 中,我得到了 FragmentsTabsPager 作为示例。
我已经非常努力地让 actionbarsherlock + 选项卡 + 片段工作。
我只能让这个设置作为静态工作,我想创建这个像 android 市场应用程序(滑动移动)。
当您需要为内部包含多个片段的布局充气时,我会卡住。
在 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. ViewPagerExtensions
你可以在这里找到它。下载 ZIP 文件并从中创建一个新项目。
我只能让这个设置作为静态工作,我想创建这个像 android 市场应用程序(swype 运动)。
com.astuetz.viewpager.extensions.SwipeyTabsView
从这个项目实施。有一些易于理解的例子。它完全符合您的要求。甚至还有其他选项卡样式可供选择(包括 ICS 附带的新人物选项卡)。此外,它的样式很容易与您的应用程序标识相匹配。
3.FragmentPagerAdapter
最后,来自支持库(v4)的那个类。
祝你好运,如果您需要更多帮助,请随时问我。
如果您使用我的建议instantiateItem
,则无需覆盖。FragmentPagerAdapter
你只需要
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
很多示例在切换回之前选择的选项卡时通常会抛出异常 ( )。
我喜欢使用 aFragmentStatePageAdapter
而不是 plain来调整 Google 的示例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 配合良好,实施起来相对简单。