Fragment sans défilement dans un ViewPager à l'intérieur de CoordinatorLayout

J'utilise un ViewPager dans un CoordinatorLayout (de la dernière version de Design Library) dans une Activité. Certains fragments pour ce ViewPager ont des mises en page telles que RecyclerView ou NestedScrollView, mais certains ne peuvent pas faire défiler compte tenu de leur petit contenu.

<android.support.design.widget.AppBarLayout android:id="@+id/tabanim_appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/MyTheme"> <android.support.v7.widget.Toolbar android:id="@+id/tabanim_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> <android.support.design.widget.TabLayout android:id="@+id/tabanim_tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/tabanim_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 

Mais dans un Fragment avec FrameLayout en tant que vue racine, je dois avoir un bouton qui est ancré au bas, mais il semble être dessiné sur l'écran. Pour pouvoir le voir, je dois ajouter un rembourrage inférieur à la hauteur de la barre d'outils.

  • Est-ce juste moi ... ou l'émulateur d'android Honeycomb 3.0 est-il vraiment lent?
  • RxJava comme bus d'événement?
  • L'Android tourne les images de 90 degrés (prises par caméra)
  • Comment simuler un événement tactile dans Android?
  • Eclipse ne reconnaît pas mon appareil Android
  • Bouton Désactiver avec sélecteur de bouton
  •   <FrameLayout 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:background="@android:color/white"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Home screen" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:layout_width="match_parent" android:layout_height="70dp" android:layout_gravity="bottom" android:gravity="center" android:text="@string/brand" android:textColor="@color/brandColor" android:textSize="20sp" /> </FrameLayout> 

    De même, un layout_gravity réglé sur 'center' sur un élément ne semble pas être au centre de la zone visible pour ce fragment.

    Ma compréhension est que CoordinatorLayout est seulement intéressé à travailler avec le contenu défilant, n'est-ce pas? Donc, en utilisant uniquement un ViewGroup régulier tel que FrameLayout, RelativeLayout, LinearLayout pour les fragments ViewPager, leur partie inférieure sera-t-elle extraite?

    Dans ce cas, dois-je supprimer ce bouton de cette disposition de fragments et le déplacer dans la mise en page d'activité contenant le CoordinatorLayout? Il doit être affiché uniquement sur le premier fragment.

  • Android | Obtenir tous les éléments enfants d'un ViewGroup
  • Comment puis-je mettre à jour le texte de notification pour un service de premier plan dans Android?
  • Gardez le texte dans TextView avec drawableLeft centered
  • Empêcher l'activité de redémarrage lorsque l'orientation change
  • Comment puis-je garder le rapport d'aspect sur les boutons d'image dans Android?
  • Typeface.ITALIC ne fonctionne pas sur Galaxy Note 2
  • 2 Solutions collect form web for “Fragment sans défilement dans un ViewPager à l'intérieur de CoordinatorLayout”

    De la référence à cette réponse Ce qui suit a fonctionné pour moi

    Étendre le comportement de la vue en spirale

     public class MyBehavior extends AppBarLayout.ScrollingViewBehavior { private View layout; public MyBehavior() { } public MyBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { boolean result = super.onDependentViewChanged(parent, child, dependency); if (layout != null) { layout.setPadding(layout.getPaddingLeft(), layout.getPaddingTop(), layout .getPaddingRight(), layout.getTop()); } return result; } public void setLayout(View layout) { this.layout = layout; } } 

    Spécifiez que le programme de visualisation

     <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.AppBarLayout> <org.nsu.myapplication.VerticalViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="your.domain.name.MyBehavior" /> </android.support.design.widget.CoordinatorLayout> 

    Et dans le code de l'activité

     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) viewPager.getLayoutParams(); MyBehavior behavior = (MyBehavior) lp.getBehavior(); behavior.setLayout(viewPager); 

    La question est causée par l'interception d'événements tactiles à partir de ViewPager par conteneur parent. Le conteneur de défilement parent écoute les événements tactiles de défilement et s'il y a un déplacement vertical, il vole l'événement à partir de ses vues enfants. Il pense simplement que l'utilisateur souhaite défiler verticalement le récipient parent

    Ci-dessous le code le résout

     import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.ScrollView; public class CustomScrollView extends ScrollView { private GestureDetector mGestureDetector; private View.OnTouchListener mGestureListener; public CustomScrollView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(context, new YScrollDetector()); setFadingEdgeLength(0); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev); } class YScrollDetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return Math.abs(distanceY) > Math.abs(distanceX); } } } 

    Utilisez cette classe au lieu de votre ViewPager

      <(your packagename).CustomScrollView android:id="@+id/tabanim_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.