23

同じフラグメントの複数のインスタンスを含む ViewPager があります。このフラグメントには記事が含まれています。記事ビューの階層は非常に単純で、タイトル、バナー画像、サブタイトル、および本文です。タイトル以外のすべてがスクロールビューにラップされます。

問題は、新しいページにスワイプすると、フラグメントの上部にビューが表示され、すぐにコンテナの中央までスクロールすることです。(実際には、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;
    }   
}

フラグメント自体も非常にシンプルです。まず、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)));     
}

また、以前はページャーがなく、フラグメントは空のアクティビティにのみロードされ、スクロールビューの中央までスクロールせずに機能したことを知っておいてください

何がスクロールをトリガーしているのか本当にわかりません。はい、読み込み後にスクロールして一番上に戻るようにプログラムで設定できることは知っていますが、フラグメントが読み込まれると2回のスクロール動作になり、ユーザーにとってはかなり目立ちます。

なぜこのように振る舞うのか、何か考えがありますか?その意図しないスクロールを止める方法についてのアイデアはありますか?

ありがとう、

以下は 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>
4

6 に答える 6

32

が原因である可能性がありandroid:textIsSelectableます。以下を ScrollView に追加してみてください。

android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
于 2013-04-24T03:23:08.853 に答える
10

android:descendantFocusability="blocksDescendants"次の質問に従って、この属性値を ScrollView の子に追加します: How to prevent a scrollview from scrolling to a webview after data is loaded?

于 2013-09-10T12:33:38.060 に答える
2

私もこの問題を抱えていました。ScrollViewのLinearLayoutの最初の要素に設定android:focusable="true"して解決しました。android:focusableInTouchMode="true"

于 2013-07-08T22:29:42.957 に答える
0

私は解決策を試しました:

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>
于 2013-09-13T08:36:39.610 に答える