ViewPager里面的ScrollView,自动滚动到中间

Posted

技术标签:

【中文标题】ViewPager里面的ScrollView,自动滚动到中间【英文标题】:ScrollView inside ViewPager, scrolls to middle automatically 【发布时间】:2013-04-17 10:24:56 【问题描述】:

我有一个 ViewPager,它包含同一个片段的多个实例,这个片段包含一篇文章。文章视图层次结构非常简单,一个标题、一个横幅图像、一个副标题和一个正文;除了标题之外的所有内容都包含在滚动视图中。

问题是,当你滑动到一个新页面时,fragment 会以 Views 在顶部呈现,然后它会立即滚动到容器的中间。 (事实上​​,它会滚动到带有 id: article_content 的 TextView 的开头)

我已在问题底部发布了布局。

现在,ViewPager 设置了 FragmentStatePagerAdapter 的简单实现,代码如下:

class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter 

    Bundle args;
    int count;

    public ScreenSlidePagerAdapter(FragmentManager fm) 
        super(fm);
        this.count = 8;
    

    @Override
    public Fragment getItem(int position) 
        ArticleFragment mPrimaryFragment = new ArticleFragment();
        args = new Bundle();
        args.putString(ArticleFragment.KEY_ARTICLE_URL, mCurArticleLink);
        mPrimaryFragment.setArguments(args);
        return mPrimaryFragment;            
    

    @Override
    public int getCount() 
        return count;
       

Fragment 本身也很简单。首先,我在onCreate 期间检查是否有文章缓存,我调用onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 

    View view = inflater.inflate(R.layout.apk_article_view, null);

    mTitle = (TextView) view.findViewById(R.id.article_title);
    mBanner = (ImageView) view.findViewById(R.id.article_banner);
    mSubTitle = (TextView) view.findViewById(R.id.article_subtitle);
    mContent = (TextView) view.findViewById(R.id.article_content);

    if (isArticleCached) 
        Constants.logMessage("Article is cached, loading from database");
        setApkArticleContent();
    
    else 
        Constants.logMessage("Article isn't cached, downloading");
        htmlHelper.setApkArticleContent(mContext, mUrl, mTitle, mSubTitle, mContent, mBanner);
        setRefreshing(true);
    

    return view;

值得注意的是setApkArticleContent是一个简单的Texts集合,没什么花哨的:

private void setApkArticleContent() 
    mTitle.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.TITLE))));
    mSubTitle.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.SUBTITLE))));
    mContent.setText(Html.fromHtml(mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.BODY))));
    UrlImageViewHelper.setUrlDrawable(mBanner, mCursor.getString(mCursor.getColumnIndex(DbOpenHelper.BANNER)));     

另外,请注意我之前没有分页器,该片段只加载到一个空的活动中,并且它在没有滚动到滚动视图中间的情况下工作.

我真的不确定是什么触发了滚动,是的,我知道我可以通过编程将其设置为在加载后滚动回顶部,但话又说回来,当片段加载和这对用户来说会很明显。

你们知道为什么它会这样吗?关于如何阻止无意滚动的任何想法?

谢谢,

下面是 ArticleFragment 的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >

<TextView
    android:id="@+id/article_title"
    style="@style/headerTextBoldNoUnderline"
    android:layout_
    android:layout_
    android:gravity="left|center_vertical"
    android:text="" />

<ScrollView
    android:layout_
    android:layout_
    >

    <LinearLayout
        android:orientation="vertical"
        android:layout_
        android:layout_
        >

        <ImageView
            android:id="@+id/article_banner"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_
            android:layout_
            android:layout_margin="12dp" />

        <TextView
            android:id="@+id/article_subtitle"
            style="@style/HeaderTextItalicNoUnderline"
            android:layout_
            android:layout_
            android:gravity="left|center_vertical" />

        <View
            android:layout_
            android:layout_
            android:background="?android:attr/dividerVertical" />

        <TextView
            android:id="@+id/article_content"
            android:layout_
            android:layout_
            android:fontFamily="sans-serif-light"
            android:gravity="left|center_vertical"
            android:padding="8dp"
            android:textColor="?android:attr/textColorSecondary"
            android:textIsSelectable="true"
            android:textSize="16sp" />
    </LinearLayout>
</ScrollView>

</LinearLayout>

【问题讨论】:

你试过弄乱ScrollView上的android:descendantFocusability吗? 刚刚做了,我实际上尝试了所有三个值,三个值都一样,滚动视图仍然滚动到中间。 注意:您可能需要将android:focusable=trueandroid:focusableInTouchMode=true 用于android:descendantFocusability=beforeDescendants。我怀疑这些问题是基于包含android:textIsSelectable。也可以尝试删除它,作为控件。 嗯,我不明白为什么 android:textIsSelectable 应该是问题的根源,毕竟之前所有的属性都在那里,当它是一个包含单个片段。但是,是的,确实工作了,它不再滚动到中间,谢谢! 顺便说一句,您应该将其作为答案,我想我可以处理无法选择文本的问题。 【参考方案1】:

这很可能是由android:textIsSelectable 引起的。您可以尝试将以下内容添加到 ScrollView:

android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"

【讨论】:

如果这不起作用,甚至可以在根 LinearLayout 上尝试这些。 将线条添加到 ScrollView 内的 LinearLayout 效果很好,还删除了 android:textIsSelectable。 谢谢!你救了我的命 将这些行添加到根 LinearLayout,工作,谢谢兄弟。 这确实有效。但是当我点击我的 textView 时,它仍然会将我滚动到文本的顶部。【参考方案2】:

将这个属性值android:descendantFocusability="blocksDescendants"添加到ScrollView的child,根据这个问题:How to prevent a scrollview from scrolling to a webview after data is loaded?

【讨论】:

【参考方案3】:

我也有这个问题。我通过将android:focusable="true"android:focusableInTouchMode="true" 设置为ScrollView 的LinearLayout 中的第一个元素来解决它。

【讨论】:

【参考方案4】:

我尝试添加

    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants"

在根视图组中。 它的工作很好。 如下所示。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants"
    android:background="@color/normal_bg">

    <ScrollView
        android:id="@+id/scroll"
        android:layout_
        android:layout_
        android:layout_above="@+id/rl_enter"
        android:scrollbars="none">
        </ScrollView>
    </RelativeLayout>

【讨论】:

您可能需要添加一些解释。【参考方案5】:

我尝试了解决方案:

android:focusable=true

android:focusableInTouchMode=true

android:descendantFocusability=beforeDescendants

我不知道为什么,但我不能用作为父视图的 RelativeLayout 来执行此操作(这不起作用)。

我不得不将我的 TextView 包装在 FrameLayout 中,现在一切正常。也许这对某人有帮助。

  <FrameLayout
        android:id="@+id/detail_description_container"
        android:layout_
        android:layout_
        android:layout_below="@id/detail_parameters_container"
        android:layout_centerInParent="true"
        android:descendantFocusability="beforeDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true" >

        <TextView
            android:id="@+id/detail_descritpion"
            android:layout_
            android:layout_
            android:autoLink="all"
            android:padding="10dp"
            android:textIsSelectable="true" />
    </FrameLayout>

【讨论】:

【参考方案6】:

ScrollViewViewPager 自动滚动但不会在中间滚动.. 看看这个。

pager.setOnPageChangeListener(new OnPageChangeListener() 

                @Override
                public void onPageSelected(int position) 
                    // TODO Auto-generated method stub
                    int x=iv.getLeft();
                    int y=iv.getTop();
                    scroll.scrollTo(x, y);
                

pagerViewPager 的对象,scrollScrollViewiv 是任何 View,比如 TextViewImageView

当我们在 viewpager 中更改页面时,滚动条会自动滚动到左侧。如果您能找到中间的解决方案,请告诉我.. :)

【讨论】:

以上是关于ViewPager里面的ScrollView,自动滚动到中间的主要内容,如果未能解决你的问题,请参考以下文章

与 scrollView 一起使用时,ViewPager 的内部内容不可见 [关闭]

ScrollView 中的 ViewPager 无法正确滚动

ViewPager 中的 ScrollView:滑动不起作用

Viewpager内滚动视图

安卓ScrollView中放ViewPager+ViewPager,ViewPager中放的是2个Fragment,Fragment中放Listview.

当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?