ViewPager内的ScrollView会自动滚动到中间

dan*_*c05 22 android android-scrollview android-viewpager

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

问题是,当您滑动到新页面时,片段会在顶部显示视图,然后立即滚动到容器的中间.(事实上​​,它滚动到TextView的开头,ID为:article_content)

我已在问题的底部发布了布局.

现在,ViewPager设置了一个简单的a实现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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这setApkArticleContent是一套简单的文本,没什么特别的:

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)));     
}
Run Code Online (Sandbox Code Playgroud)

此外,请知道我之前没有寻呼机,片段只被加载到一个空活动,并且它可以在不滚动到scrollview中间的情况下工作.

我真的不确定触发滚动的是什么,是的,我知道我可以以编程方式将其设置为在加载后滚动回顶部,但是再次,当片段加载时它将是两个滚动动作并且它将是对用户来说非常明显.

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

谢谢,

以下是ArticleFragment的布局:

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

<TextView
    android:id="@+id/article_title"
    style="@style/headerTextBoldNoUnderline"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left|center_vertical"
    android:text="" />

<ScrollView
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >

    <LinearLayout
        android:orientation="vertical"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        >

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

        <TextView
            android:id="@+id/article_subtitle"
            style="@style/HeaderTextItalicNoUnderline"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center_vertical" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="1dp"
            android:background="?android:attr/dividerVertical" />

        <TextView
            android:id="@+id/article_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            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>
Run Code Online (Sandbox Code Playgroud)

Pau*_*rke 32

这可能是由于android:textIsSelectable.您可以尝试将以下内容添加到ScrollView:

android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
Run Code Online (Sandbox Code Playgroud)

  • 将行添加到ScrollView内部的LinearLayout运行良好,也删除了android:textIsSelectable. (7认同)
  • 也许甚至可以在根LinearLayout上尝试这些,如果这不起作用. (2认同)

Aym*_*oub 10

android:descendantFocusability="blocksDescendants"根据这个问题,将此属性值添加到ScrollView的子节点:如何防止滚动视图在加载数据后滚动到webview?