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>
Haben Sie versucht, mit der 'android: democendantFocusability' auf der ScrollView zu spielen? –
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. –
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. –