Ответ 1
Вероятно, это вызвано android:textIsSelectable
. Вы можете попробовать добавить в ScrollView следующее:
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
У меня есть 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;
}
}
Сам фрагмент довольно прост. Во-первых, я проверяю во время 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)));
}
Также, пожалуйста, знайте, что раньше у меня не было пейджера, фрагмент был загружен только в пустую активность, а работал без прокрутки до середины прокрутки.
Я действительно не уверен, что вызывает свиток, и да, я знаю, что я могу программно настроить его на прокрутку назад в верхнюю часть после загрузки, но опять же, это будет два движения прокрутки при загрузке фрагмента и это было бы заметно для пользователя.
У вас, ребята, есть идеи, почему так будет выглядеть? Любые идеи о том, как я могу остановить этот непреднамеренный свиток?
Спасибо,
Ниже приведен макет для объекта 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>
Вероятно, это вызвано android:textIsSelectable
. Вы можете попробовать добавить в ScrollView следующее:
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
Добавьте значение этого атрибута android:descendantFocusability="blocksDescendants"
дочернему элементу ScrollView в соответствии с этим вопросом: Как предотвратить прокрутку прокрутки в веб-обозревателе после загрузки данных?
У меня также была эта проблема. Я решил это, установив android:focusable="true"
и android:focusableInTouchMode="true"
в первый элемент в ScrollView LinearLayout.
Я пробовал решение:
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>
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
say TextView
или ImageView
.
Когда мы меняем страницу в viewpager, полоса прокрутки автоматически прокручивается, но влево. Если бы вы нашли решение для среднего, пожалуйста, дайте мне знать..:)
Я пытаюсь добавить
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
в корневой таблице. он работает хорошо. как показано ниже.
<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>