ScrollView dentro de ViewPager, se desplaza automáticamente hacia el centro

Tengo un ViewPager que contiene varias instancias del mismo fragmento, este fragmento contiene un artículo. La jerarquía de vista de artículo es bastante simple, un título, una imagen de Banner, un subtítulo y un cuerpo; todo, pero el título está envuelto en un scrollview.

El problema es que cuando se pasa a una nueva página, el fragmento se presenta con las vistas en la parte superior y, a continuación, se desplaza inmediatamente a la mitad del contenedor. (De hecho, se desplaza al principio de la TextView con id: article_content )

He publicado el diseño en la parte inferior de la pregunta.

Ahora, el ViewPager se establece con una simple implementación de un FragmentStatePagerAdapter , aquí está el código:

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

El Fragmento en sí es bastante simple también. En primer lugar, comprobar durante onCreate para ver si tenemos el artículo en caché, la invitación on 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; } 

Vale la pena señalar que setApkArticleContent es un simple conjunto de Textos, nada extravagante:

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

También, por favor sepa que no tenía un paginador antes , el fragmento sólo se cargó en una actividad vacía, y funcionó sin desplazarse hasta el centro del scrollview .

Realmente no estoy seguro de lo que está desencadenando el desplazamiento, y sí, sé que puedo programatically configurarlo para desplazarse de nuevo a la parte superior después de la carga, pero de nuevo, que sería dos movimientos de desplazamiento cuando el fragmento se carga y sería bastante notable para el usuario.

¿Tienen ustedes alguna idea de por qué se comportaría así? ¿Alguna idea sobre cómo puedo detener ese desplazamiento involuntario?

Gracias,

A continuación se muestra el diseño del artículo:

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

Esto es probablemente causado por android:textIsSelectable . Puede intentar agregar lo siguiente a ScrollView:

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

Añada este valor de atributo android:descendantFocusability="blocksDescendants" al hijo de ScrollView, de acuerdo con esta pregunta: ¿Cómo evitar que una vista de desplazamiento se desplace a una vista web después de cargar los datos?

Yo también tuve este problema. Lo resolví con la configuración de android:focusable="true" y android:focusableInTouchMode="true" al primer elemento en el LinearLayout del ScrollView.

He intentado la solución:

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

Y no sé por qué, pero no puedo hacer esto con mi RelativeLayout que es la vista de los padres (esto no funciona).

Tuve que envolver mi TextView dentro FrameLayout y ahora todo está bien. Tal vez esto ayuda a alguien.

  <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 dentro de ViewPager desplaza automáticamente, pero no se desplaza en la mitad .. Compruebe esto.

 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 es el objeto de ViewPager y scroll es ScrollView y iv es cualquier View dice TextView o ImageView .

Cuando cambiamos la página en viewpager, la barra de desplazamiento se desplaza automáticamente, pero a la izquierda. Si usted tendría que encontrar la solución a la mitad por favor hágamelo saber .. 🙂

yo intento agregar

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

en el grupo de vistas raíz. su trabajo está bien. como abajo.

  <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> 
  • Android ViewPager llama manualmente a PageTransformer transformPage
  • ¿Cómo puedo poner widgets y accesos directos en la página de viewpager?
  • CollapsingToolbarLayout con un ViewPager
  • ViewPager parece reenable clipChildren al desplazarse si se configura PageTransformer
  • ¿Cómo obtener un recurso de cadena en el adaptador ViewPager?
  • Pestañas de la barra de acciones anidadas (con ViewPager)
  • Java.lang.IllegalArgumentException: El observador es nulo
  • Actividad de inicio de Fragmento causa NullPointerException
  • ¿Cómo puedo usar View pager con touchimageview?
  • Botón en ViewPager desplazarse a la página específica
  • Permitir rotación / paisaje en un fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.