在ViewPager中设计Horizo​​ntalScrollView或使用片段:

Emi*_*Adz 8 android android-layout android-fragments android-viewpager

我需要设计以下屏幕,我需要你的建议:

在此输入图像描述

说明:

标题是静态/固定的,我不需要对它做任何事情.

黄色:这是有趣的部分,我需要设计一个ViewPager类似的屏幕,能够向左/右滚动最多4个屏幕.

红色:在每个屏幕中,我需要添加一个可滚动的表格/网格,如果它不适合屏幕大小.

绿色:可以使用屏幕底部的绿色按钮或通过滚动来完成页面切换ViewPager.

问题是:这种行为可以使用ViewPager或者我应该使用Fragments吗?如果Fragment是要走的路,那么我将如何使用滑动手势实现页面切换?如果它是一个ViewPager然后如何添加内部滚动以及如何使用底部的按钮控制它?

任何帮助将不胜感激,谢谢.

Oce*_*ife 7

我认为这应该用Non Swipeable 来解决ViewPager.视图寻呼机和底层Fragments无法响应滑动手势.覆盖禁用滑动的方法ViewPager有:

  1. onTouchEvent()- 退货false.
  2. onInterceptTouchEvent()- 退货false.

有关如何实现此目的的更多信息,请参阅此SO问题.

接下来,您希望Fragment在每个寻呼机持有者中使用s.所以我们正在构建以下布局:

在父活动FragmentPagerAdapter中,实例化a并且您的选项卡添加了标记:

活动变化

@Override
protected void onCreate(final Bundle saveInstanceState) {
    final FragmentPagerAdapter myTabAdapter = new MyFragmentPagerAdapter(
            <Your ViewPager View>, <Your activity context, this>);
    myTabAdapter.addTab(getActionBar().newTab(), "YOUR TAG", "Your Title");
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

所以这给了我们上图的框架.托管活动,包含a ViewPager和底层选项卡.接下来是将Fragments(包含表格)放入每个相应的选项卡中.这由FragmentPagerAdapter实现处理:

片段适配器(内部类到活动):

private class MyFragmentPagerAdapter extends FragmentPagerAdapter implements
        ActionBar.TabListener, ViewPager.OnPageChangeListener {

    /**
     * Constructs a pager adapter to back a {@link ViewPager}.
     * 
     * @param pager
     *            The {@link ViewPager} widget.
     * @param activityContext
     *            The context the widget is being added under.
     */
    public SpotMenuFragmentPagerAdapter(final ViewPager pager,
            final Context activityContext) {
        super(getFragmentManager());
        pager.setAdapter(this);
        this.context = activityContext;
    }

    /**
     * Adds a tab to the hosting activity action bar.
     * 
     * @param newTab
     *            The tab to add.
     * @param tag
     *            The tab tag for id purposes.
     * @param label
     *            The label of the tab displayed to the user.
     */
    public void addTab(final ActionBar.Tab newTab, final String tag,
            final String label) {
        newTab.setTag(tag);
        newTab.setText(label);
        newTab.setTabListener(this);
        getSupportActionBar().addTab(newTab);
    }

    /**
     * This is where you do the work of building the correct fragment based
     * on the tab currently selected.
     * 
     * @see FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(final int position) {
        final Tab tab = getActionBar().getTabAt(position);
        if ("MY TAG".equals(tab.getTag().toString()) {
            // instantiate the fragment (table) for "MY TAG"
        } else {
            // instantiate something else...
        }
    }

    /**
     * One fragment per tab.
     * 
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        return getSupportActionBar().getTabCount();
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageScrollStateChanged(int)
     */
    @Override
    public void onPageScrollStateChanged(final int arg0) {
        // No-op.
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageScrolled(int, float, int)
     */
    @Override
    public void onPageScrolled(final int arg0, final float arg1,
            final int arg2) {
        // No-op.
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageSelected(int)
     */
    @Override
    public void onPageSelected(final int position) {
        getSupportActionBar().setSelectedNavigationItem(position);
    }

    /**
     * @see TabListener#onTabSelected(app.ActionBar.Tab,
     *      app.FragmentTransaction)
     */
    @Override
    public void onTabSelected(final Tab tab, final FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    /**
     * @see TabListener#onTabUnselected(ActionBar.Tab,
     *      app.FragmentTransaction)
     */
    @Override
    public void onTabUnselected(final Tab tab, final FragmentTransaction ft) {
        // No-op.
    }

    /**
     * @see TabListener#onTabReselected(ActionBar.Tab,app.FragmentTransaction)
     */
    @Override
    public void onTabReselected(final Tab tab, final FragmentTransaction ft) {
        // No-op.
    }
}
Run Code Online (Sandbox Code Playgroud)

所以希望在这一点上我们有一个活动主持一个'不可刷卡'的视图寻呼机和一个机制,用于切换标题栏下方标签栏形式的标签(或根据屏幕大小并排).从这一点来看,我相信你可以自定义用一些导航箭头替换标签栏.

注意:很多都是从记忆中写出来的,但希望我已经传达了我要去的地方的要点.

更新

响应更新的问题:您可以将选项卡设置为任何旧视图.相应地设置TabSpec.道歉我自己没有用过这个.