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 )
- Los fragmentos de ViewPager no se recrean después de FragmentTransaction.replace () seguido por el botón de retroceso
- Los fragmentos no se liberan de la memoria
- ¿Cómo puedo mostrar un ViewPager en modo de pantalla completa?
- SwipeRefreshLayout intercepta con ViewPager
- GetTag () devuelve siempre null cuando se llama en fragmento
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>
- Android: setPrimaryItem () de PagerAdapter se llama más de una vez
- Cómo simular un evento de arrastre en un ViewPager en Roboeléctrico?
- Menú como SKOUT y deslizamiento de una vista a otra mediante el toque en Android
- Cómo obtener la posición actual en FragmentPagerAdapter?
- Deshabilitar ItemTouchHelper para una parte de un visor
- ViewPager + PagerAdapter muestra páginas en blanco después de los dos primeros elementos
- ¿Cómo hacer el FAB evitar ser movido en ViewPager, sin embargo, ser una parte del fragmento dentro?
- Fuera de error de memoria viewpager + imageView
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>
- TileProvider método getTile – necesita traducir xyy a lat / long
- Cómo conectar múltiples recyclerview o fragmento de animación como se muestra