Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Posición de PagerTabStrip dentro de ViewPager

Tengo el siguiente código:

<android.support.v4.view.ViewPager android:id="@+id/main_pager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.PagerTabStrip android:id="@+id/pager_tab_strip" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.v4.view.ViewPager> 

Y todo se pone layouted como debería.

Lo que quiero ahora es que el PagerTabStrip supera el ViewPager .

Se debe representar en la parte superior sin ocupar ningún espacio de diseño. Básicamente los fragmentos en el ViewPager deben comenzar en 0,0 como el PagerTabStrip está haciendo.

Cualquier ayuda apreciada. ¡Gracias!

  • VideoView en Viewpager, detener el vídeo al cambiar de página
  • Outofmemeoryerror (viewpager + visiones de imagen)
  • ViewPager con límites de páginas anteriores y siguientes
  • Objetos de comunicación entre fragmentos múltiples en ViewPager
  • Fragmento de elementos compartidos no funcionan con ViewPager
  • Página curl con vista pager
  • Error al inflar TextInputLayout cuando se utiliza con ViewPager
  • Puedo usar el paginador de vista con vistas (no con fragmentos)
  • 2 Solutions collect form web for “Posición de PagerTabStrip dentro de ViewPager”

    Finalmente encontré una manera de hacer esto.

    En el onAttachedToWindow del PagerTitleStrip, esto comprueba que el padre sea un ViewPager:

     final ViewParent parent = getParent(); if (!(parent instanceof ViewPager)) { throw new IllegalStateException("PagerTitleStrip must be a direct child of a ViewPager."); } 

    Por lo tanto, esto tiene que ir.

    Solución:

    Lo solucioné ahora creando mi propio PagerTitleStrip / PagerTabStrip personalizado. Quité el comportamiento anterior y lo reemplazé por un atributo de estilo para mi PagerTitleStrip que apunta a ViewPager. Esto se define en los valores / attrs.xml como este:

     <declare-styleable name="PagerTitleStripCustom"> <attr name="parentViewPager" format="reference" /> </declare-styleable> 

    Y lee en el constructor PagerTitleStrip así:

     TypedArray types = context.obtainStyledAttributes(attrs,R.styleable.PagerTitleStripCustom, 0, 0); pagerID = types.getResourceId(R.styleable.PagerTitleStripCustom_parentViewPager, 0); 

    En el onAttachedToWindow ahora podemos comprobar si la variable mViewPager es null y asignarla a nuestro pagerID así:

     @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); final ViewParent parent = getParent(); ViewPager pager = null; if (pagerID != 0) { View test2 = ((View) parent).findViewById(pagerID); pager = (ViewPager) test2; } else if (pagerID == 0 && (parent instanceof ViewPager)) { pager = (ViewPager) parent; } else if (pagerID == 0 && !(parent instanceof ViewPager)) { throw new IllegalStateException("PagerTitleStrip is neither a direct child of a ViewPager nor did you assign the ID of the ViewPager."); } else { throw new IllegalStateException("PagerTitleStrip: Something went completely wrong."); } final PagerAdapter adapter = pager.getAdapter(); pager.setInternalPageChangeListener(mPageListener); pager.setOnAdapterChangeListener(mPageListener); mPager = pager; updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter); } 

    Ahora el control PagerTitleStrip / PagerTabStrip se puede colocar libremente en el diseño como este:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res/com.YOUR.PATH" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/main_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.v4.view.PagerTabStripCustom android:layout_width="match_parent" android:layout_height="wrap_content" custom:parentViewPager="@id/main_pager" /> </RelativeLayout> 

    Esta es sólo la prueba rápida y sucia del concepto. Espero que esto ayude a alguien.

     <RelativeLayout android:id="@+id/view_pager_container android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.v4.view.ViewPager android:id="@+id/main_pager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.PagerTabStrip android:id="@+id/pager_tab_strip" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.v4.view.ViewPager> </RelativeLayout> 

    Cuando se utiliza un RelativeLayout, si no se especifica dónde debe colocarse una vista cuando se agrega, las vistas se añaden simplemente encima de cada una de ellas en la parte superior izquierda (o posición 0, 0) de RelativeLayout.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.