2013-04-24 13 views
19

Ich habe einen ViewPager, der mehrere Instanzen desselben Fragments enthält, dieses Fragment enthält einen Artikel. Die Artikelansichtshierarchie ist ziemlich einfach, ein Titel, ein Bannerbild, ein Untertitel und ein Körper; Alles außer dem Titel ist in einem Scrollview verpackt.ScrollView in ViewPager, scrollt automatisch in die Mitte

Das Problem ist, wenn Sie auf eine neue Seite streichen, wird das Fragment mit den Ansichten an der Spitze präsentiert, und es rollt dann sofort in der Mitte des Behälters. (In der Tat scrollt es an den Anfang des TextView mit ID: article_content)

Ich habe das Layout am Ende der Frage veröffentlicht.

nun die ViewPager mit einer einfachen Implementierung eines FragmentStatePagerAdapter gesetzt ist, dann ist hier 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 ziemlich einfach zu. Zuerst prüfe ich während onCreate zu sehen, ob wir den Artikel gecached haben, die ich Anruf auf 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; 
} 

Es ist erwähnenswert, dass setApkArticleContent eine einfache Reihe 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)));  
} 

Außerdem, bitte wissen, dass Ich hatte keinen Pager vor, das Fragment wurde nur in eine leere Aktivität geladen, und es funktioniert ohne Scrollen bis zur Mitte der scrollview.

Ich bin mir wirklich nicht sicher, was das Scrollen auslöst, und ja, ich weiß, dass ich es programmatisch einstellen kann, um nach dem Laden wieder nach oben zu scrollen, aber das wären dann zwei Scroll-Bewegungen, wenn das Fragment geladen wird und es wäre für den Benutzer ziemlich auffällig.

Habt ihr irgendwelche Ideen, warum es sich so verhalten würde? Irgendwelche Ideen, wie ich diese unbeabsichtigte Scroll stoppen kann?

Danke,

Unter dem Layout für die ArticleFragment ist:

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

Haben Sie versucht, mit der 'android: democendantFocusability' auf der ScrollView zu spielen? –

+0

Nur habe ich tatsächlich alle drei Werte dafür ausprobiert, habe die gleichen Ergebnisse für alle drei, der Scrollview scrollt immer noch in die Mitte. –

+0

Hinweis: Möglicherweise müssen Sie 'android: focusable = true' und' android: focusableInTouchMode = true' für 'android: demcendantFocusability = beforeDescendants' verwenden. Ich vermute, dass die Probleme in der Aufnahme von "android: textIsSelectable" basieren. Versuchen Sie auch, das als Kontrolle zu entfernen. –

Antwort

28

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

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

Vielleicht sogar versuchen, diese auf der Wurzel LinearLayout, wenn dies nicht funktioniert. –

+7

Das Hinzufügen der Zeilen zum LinearLayout innerhalb der ScrollView funktionierte gut, auch das Entfernen des android: textIsSelectable. –

+1

Danke! Du hast mein Leben gerettet – jackcar

2

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

0

I-Lösung versucht:

android:focusable=true 

android:focusableInTouchMode=true 

android:descendantFocusability=beforeDescendants 

Und ich weiß nicht, warum, aber ich kann dies tun, mit meinem RelativeLayout der ist die Elternansicht (das funktioniert nicht).

Ich musste meine TextView in FrameLayout und jetzt alles ist 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

ScrollView innerhalb ViewPager scrollt automatisch, aber nicht blättert in Mitte .. Schauen Sie sich diese.

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 ViewPager ‚s Objekt und scroll ist ScrollView und iv ist jede View sagen TextView oder ImageView.

Wenn wir die Seite im viewpager ändern, scrollt die Bildlaufleiste automatisch, aber nach links. Wenn Sie finden Lösung zu Mitte haben lass es mich wissen .. :)

0

ich versuche

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

in der Wurzel Viewgroup hinzuzufügen. es ist Arbeit gut. wie unten.

+0

Sie können einige Wörter der Erklärung hinzufügen. – mkl

Verwandte Themen