Actionbarsherlock + tabs +多片段?

Mar*_*ujo 17 tabs android android-fragments actionbarsherlock

我努力让actionbarsherlock + tabs + fragment工作.

我只能让这套作为静态工作,我想创建这个像Android市场应用程序(滑动运动).

当你需要用里面的多个片段来扩充布局时,我会陷入困境.

在Support4demos中,我以FragmentsTabsPager为例进行了跟踪.

Rym*_*nel 38

我实际上设法让这个工作没有任何东西,只有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) {
    }
}
}
Run Code Online (Sandbox Code Playgroud)

您可以根据以下内容加载选项卡内容.

mTabsAdapter.addTab(bar.newTab().setText("Home"),
            YOURFRAGMENTHERE.class, null);  
Run Code Online (Sandbox Code Playgroud)

通过ABS,支持库和片段,这将为您提供可爱的"swipey tab"效果.ABS真的使它与使用本机库几乎相同.我实际上直接从Googles分页标签示例复制了这段代码,并且对于ABS进行了稍微修改.

希望这可以帮助!

  • 感谢您的示例代码,这正是我所寻找的!有一件事虽然我似乎不明白,什么是"CustomViewPager"有用?它似乎也适用于默认的ViewPager. (2认同)

dav*_*ino 10

您需要正确的库来实现您想要的.

基本上,ViewPager图书馆是您缺少的.我的建议:

1. ActionbarSherlock

这很容易使用,我不会解释它.

2. ViewPagerExtensions

你可以在这里找到它.下载ZIP文件并从中创建一个新项目.

我只能让这个设置作为静态工作,我想创建这个像Android市场应用程序(swype运动).

com.astuetz.viewpager.extensions.SwipeyTabsView从这个项目实施.有一些易于理解的例子.它完全符合你的要求.甚至还有其他选项卡样式可供选择(包括ICS附带的新人员选项卡).此外,它很容易设计风格以匹配您的应用程序标识.

3. FragmentPagerAdapter

最后,来自支持库的那个类(v4).

祝你好运,如果你需要更多的帮助,可以随意问我.


如果您使用我建议的内容instantiateItem,FragmentPagerAdapter则无需覆盖.你只需要

  1. 提供一个带有a的构造函数FragmentManager并调用super实现;
  2. 覆盖getCount以返回寻呼机中的片段数量,以及
  3. 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此寻呼机处理两个"页面",左侧显示销售数据.正确的允许用户选择哪个部门.这些都是在getItem方法中返回的.适当的片段(您可以使用已有的片段,无需修改).

正如预期的那样,您将所有这些结合在一起:1)创建一个实例化的对象MyFragmentPagerAdapter,以及2)将适配器设置为ViewPager您刚刚实例化的对象.正如您所看到的,它的getItem方法将为寻呼机"提供"您需要的所有片段.例:

mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

当然,还有其他事情要做,比如自己创建标签按钮并加入所有这些以进行交叉通信.我建议查看从GitHub下载的ViewPagerExtensions ZIP文件中提供的示例.这只是您评论中问题的答案.正如您所看到的,使用此库的代码并不多.