it-swarm.com.de

ScrollView in ViewPager, scrollt automatisch zur Mitte

Ich habe einen ViewPager, der mehrere Instanzen desselben Fragments enthält. Dieses Fragment enthält einen Artikel. Die Hierarchie der Artikelansicht ist recht einfach: ein Titel, ein Bannerbild, ein Untertitel und ein Hauptteil. Alles außer dem Titel ist in einem Bildlauf eingeschlossen. 

Das Problem ist , wenn Sie zu einer neuen Seite streichen, wird das Fragment mit den Ansichten am oberen Rand angezeigt und blättert dann sofort zur Mitte des Containers. (Tatsächlich scrollt es mit id: article_content an den Anfang der TextView.)

Ich habe das Layout am Ende der Frage gepostet. 

Der ViewPager enthält nun eine einfache Implementierung einer FragmentStatePagerAdapter, hier ist der Code:

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

Das Fragment selbst ist auch ziemlich einfach. Zuerst überprüfe ich während onCreate, ob der Artikel zwischengespeichert ist, und ich rufe onCreateView auf.

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

Es ist erwähnenswert, dass setApkArticleContent ein einfacher Satz von Texten ist, nichts Besonderes: 

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

Bitte beachten Sie auch, dass Ich hatte zuvor keinen Pager , das Fragment wurde nur in eine leere Aktivität geladen und funktionierte ohne Scrollen in die Mitte des Bildlaufs .

Ich bin wirklich nicht sicher, was die Bildrolle auslöst, und ja, ich weiß, dass ich programmgesteuert einstellen kann, dass nach dem Laden wieder nach oben geblättert wird, aber das wären zwei Bildlaufbewegungen, wenn das Fragment geladen ist und es wäre für den Benutzer ziemlich auffällig. 

Habt ihr eine Idee, warum es sich so verhalten würde? Irgendwelche Ideen, wie ich das ungewollte Scrollen stoppen kann? 

Vielen Dank, 

Hier ist das Layout für das 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>
20
daniel_c05

Dies wird wahrscheinlich durch Android:textIsSelectable verursacht. Sie können versuchen, der ScrollView Folgendes hinzuzufügen:

Android:focusable="true"
Android:focusableInTouchMode="true"
Android:descendantFocusability="beforeDescendants"
31
Paul Burke

Fügen Sie diesen Wert des Attributs Android:descendantFocusability="blocksDescendants" dem untergeordneten Element von ScrollView hinzu, und zwar entsprechend dieser Frage: Wie kann verhindert werden, dass ein Scrollview zu einem Webview scrollt, nachdem Daten geladen wurden?

10
Ayman Mahgoub

Ich hatte auch dieses Problem. Ich löste es mit der Einstellung Android:focusable="true" und Android:focusableInTouchMode="true" auf das erste Element im LinearLayout von ScrollView.

2
peter.bartos

ich versuche hinzuzufügen 

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

in der root-AnsichtGruppe. ist die Arbeit gut. wie unten.

 <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>
0
xingkun zheng

ScrollView in ViewPager scrollt automatisch, aber nicht in der Mitte. Überprüfen Sie dies.

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 ist ViewPagers Objekt und scroll ist ScrollView und iv ist eine beliebige View, sagen Sie TextView oder ImageView

Wenn wir die Seite im Viewpager wechseln, wird die Bildlaufleiste automatisch nach links verschoben. Wenn Sie eine mittlere Lösung gefunden haben, lassen Sie es mich wissen .. :) 

0
Rohit

Ich habe die Lösung ausprobiert: 

Android:focusable=true

Android:focusableInTouchMode=true

Android:descendantFocusability=beforeDescendants

Und ich weiß nicht warum, aber ich kann dies nicht mit meinem RelativeLayout tun, der übergeordnete Ansicht ist (dies funktioniert nicht). 

Ich musste mein TextView in FrameLayout einpacken und jetzt ist alles in Ordnung. Vielleicht hilft das jemandem. 

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