0

我正在编写一个使用许多片段的应用程序。我使用过 ActionBarSherlock(带有 ActionBar)。为了解决错误 # 240,我决定切换一个功能正常的实现以将 ActionBarSherlock 与TabHost一起使用。经过半个小时的工作,它工作正常,除了当我在页面之间滑动时:选择了对应的选项卡,但没有居中并且通常甚至不可见,因此用户无法看到选择了哪个选项卡。

在此处输入图像描述

在图片中,您可以看到可见片段(“WEEKLY S..”),但选项卡只有一半可见。下一次滑动只会使“WEEKLY S...”看起来像“CALENDAR EVENTS”,除非我手动滑动 TabWidget,否则我不知道选择了哪个选项卡。

这是我的activity_main.xml:

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <HorizontalScrollView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fillViewport="true"
            android:scrollbars="none" >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:tabStripEnabled="true"
                android:orientation="horizontal" />

        </HorizontalScrollView>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>

</TabHost>

我的 TabsAdapter 与Jake WhartonFragmentTabsPager示例相同。

欢迎任何建议!

4

2 回答 2

6

多亏了这篇文章,尤其是jucas,我​​设法让它工作了。这是代码:

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    View tabView = mTabHost.getTabWidget().getChildAt(position);
    if (tabView != null)
    {
        final int width = mHorizontalScroll.getWidth();
        final int scrollPos = tabView.getLeft() - (width - tabView.getWidth()) / 2;
        mHorizontalScroll.scrollTo(scrollPos, 0);
    } else {
        mHorizontalScroll.scrollBy(positionOffsetPixels, 0);
    }
}

当然,我必须mHorizontalScroll在几个地方进行初始化。(如果有人不知道该怎么做,我很乐意发布完整的代码。)

于 2013-05-17T14:03:08.730 回答
0

我在 onPageChangeListener 中添加了以下代码来解决这个问题。

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {


        @Override
        public void onPageSelected(int position) {
            // on changing the page make respected tab selected
            //actionBar.setSelectedNavigationItem(position);
            mTabHost.setCurrentTab(position);
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            View tabView = mTabHost.getTabWidget().getChildAt(position);
            View mHorizontalScroll = (HorizontalScrollView) findViewById(R.id.mHorizontalScroll);
            if (tabView != null)
            {
                int width = mHorizontalScroll.getWidth();
                int scrollPos = tabView.getLeft() - (width - tabView.getWidth()) / 2;
                mHorizontalScroll.scrollTo(scrollPos, 0);
            } else {
                mHorizontalScroll.scrollBy(positionOffsetPixels, 0);
            }
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    });
于 2015-05-26T20:26:36.913 回答