滚动型内ViewPager,自动滚动到中间(ScrollView inside ViewPager,

2019-08-31 23:37发布

我有一个包含相同片段的几个实例一ViewPager,该片段包含的文章。 该文章视图层次结构相当简单,标题,横幅图片,副标题和正文; 一切,但标题被包裹在一个滚动视图。

问题是 ,当你刷到一个新的页面,该片段呈现在顶部视图,然后立即滚动到容器的中间。 (由于事实上它滚动到id TextView的的开头:article_content)

我已经在这个问题的底部贴布局。

现在,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;
    }   
}

片段本身是很简单了。 首先,我在检查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是一组简单的文本,没有什么花哨的:

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_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>

Answer 1:

这可能是造成android:textIsSelectable 。 您可以尝试添加以下的滚动型:

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


Answer 2:

添加该属性值android:descendantFocusability="blocksDescendants"以滚动型的孩子,按照这样的问题: 如何防止滚动网页视图滚动型加载数据后?



Answer 3:

我也有这个问题。 我设置解决了它android:focusable="true"android:focusableInTouchMode="true"到了滚动的LinearLayout中的第一个元素。



Answer 4:

我尝试添加

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

在根的ViewGroup。 这是工作的好。 如下图所示。

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

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


Answer 5:

我试过的解决方案:

android:focusable=true

android:focusableInTouchMode=true

android:descendantFocusability=beforeDescendants

而且我不知道为什么,但我不能用我的RelativeLayout这是父视图做到这一点(这不起作用)。

我不得不换我里面的FrameLayout TextView的,现在一切正常。 也许这可以帮助别人。

  <FrameLayout
        android:id="@+id/detail_description_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        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_width="match_parent"
            android:layout_height="wrap_content"
            android:autoLink="all"
            android:padding="10dp"
            android:textIsSelectable="true" />
    </FrameLayout>


Answer 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是任何ViewTextViewImageView

当我们在viewpager更改页面,滚动条会自动滚动,但到左边。 如果你必须找到解决中等请让我知道.. :)



文章来源: ScrollView inside ViewPager, scrolls to middle automatically