Подтвердить что ты не робот

ScrollView внутри ViewPager, автоматически прокручивается до середины

У меня есть ViewPager, который содержит несколько экземпляров одного и того же фрагмента, этот фрагмент содержит статью. Иерархия представлений статьи довольно проста: заголовок, изображение баннера, субтитр и тело; все, кроме заголовка, завернуто в scrollview.

Проблема заключается в, когда вы переходите на новую страницу, фрагмент отображается с надстройками вверху, а затем он немедленно прокручивается до середины контейнера. (На самом деле он прокручивается до начала TextView с id: 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>
4b9b3361

Ответ 1

Вероятно, это вызвано android:textIsSelectable. Вы можете попробовать добавить в ScrollView следующее:

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

Ответ 3

У меня также была эта проблема. Я решил это, установив android:focusable="true" и android:focusableInTouchMode="true" в первый элемент в ScrollView LinearLayout.

Ответ 4

Я пробовал решение:

android:focusable=true

android:focusableInTouchMode=true

android:descendantFocusability=beforeDescendants

И я не знаю, почему, но я не могу сделать это с моим RelativeLayout, который является родительским (это не работает).

Мне пришлось обернуть мой TextView внутри FrameLayout, и теперь все в порядке. Может быть, это помогает кому-то.

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

Ответ 5

ScrollView внутри ViewPager прокручивается автоматически, но не прокручивается в середине. Проверьте это.

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);
                }

pager - объект ViewPager, а scroll - ScrollView, а iv - любой View say TextView или ImageView.

Когда мы меняем страницу в viewpager, полоса прокрутки автоматически прокручивается, но влево. Если бы вы нашли решение для среднего, пожалуйста, дайте мне знать..:)

Ответ 6

Я пытаюсь добавить

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