我有一个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;
}
}
Fragment本身也很简单。首先,我在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)));
}
另外,请知道我之前没有寻呼机,片段只被加载到空活动中,并且工作而不滚动到scrollview的中间
我真的不确定触发滚动的是什么,是的,我知道我可以以编程方式将其设置为在加载后滚动回顶部,但是再次,当片段加载时,这将是两个滚动动作这对用户来说非常明显。
你们有什么想法,为什么它会像这样?关于如何阻止无意滚动的任何想法?
谢谢,
以下是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>
答案 0 :(得分:31)
这可能是由android:textIsSelectable
引起的。您可以尝试将以下内容添加到ScrollView:
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
答案 1 :(得分:10)
根据这个问题,将此属性值android:descendantFocusability="blocksDescendants"
添加到ScrollView的子项:How to prevent a scrollview from scrolling to a webview after data is loaded?
答案 2 :(得分:2)
我也有这个问题。我通过将android:focusable="true"
和android:focusableInTouchMode="true"
设置为ScrollView的LinearLayout中的第一个元素来解决它。
答案 3 :(得分:1)
我尝试添加
$response = new ApiResponse(ApiResponse::STATUS_SUCCESS);
return new JsonResponse($response); // <-- I would like to use the JMS serializer
在根视图组中。 它的工作做得很好。 如下。
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
答案 4 :(得分: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>
答案 5 :(得分:0)
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
说TextView
或{ {1}}。
当我们在viewpager中更改页面时,滚动条会自动滚动但向左滚动。如果你能找到中间的解决方案,请告诉我.. :)