web-dev-qa-db-fra.com

La bordure inférieure de CardView est coupée à l'intérieur de ScrollView android

Je mets la vue de carte à l'intérieur de scrollview, nous nous attendons à voir qu'en bas, la bordure devrait être montrée voir la photo ci-dessous. Mais ce n'est pas. Le problème est que je ne peux pas faire défiler vers le bas pour voir la bordure de cardview.

Toutes les solutions sur SO consistent à changer layout_margins en padding, mais ce n'est pas le cas pour cardview si nous voulons montrer la bordure. J'ai essentiellement tout essayé. Mais ne fonctionne toujours pas.  scroll to bottom cannot see the border

Image 1. défiler vers le bas ne peut pas voir la bordure

 we can see the top border

Photo 2. On peut voir le bord supérieur

Voici le code XML

<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:custom="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
>
    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fillViewport="true">

            <Android.support.v7.widget.CardView
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_margin="8dp">
                    <LinearLayout
                      Android:layout_width="match_parent"
                      Android:layout_height="wrap_content"
                      Android:orientation="vertical"
                      >
                     ...
                    </LinearLayout>
           </CardView>
  </LinearLayout>

références: ScrollView ne défile pas vers le bas

ScrollView coupe le haut et laisse de l'espace en bas

Je ne peux pas afficher LinearLayout en bas pour faire défiler la vue

Android ScrollView refuse de faire défiler vers le bas

15
Cheng

Une solution que je viens de trouver consiste à envelopper CardView avec un LinearLayout ou un RelativeLayout et à définir son remplissage. Par exemple, si vous voulez un effet d’ombre portée dans cardView, disons 8dp, vous pouvez définir un remplissage 4dp de votre LinearLayout ou RelativeLayout et 4dp layout_margin de CardView.

4
Cheng

J'ai rencontré le même problème et ai dû faire ce qui suit (la clé est l'encapsuleur LinearLayout autour de la vue carte où j'ai ajouté le paddingBottom ):

<ScrollView
    Android:id="@+id/item_scrollview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:scrollbars="none"
    tools:visibility="visible">

    <LinearLayout
        Android:id="@+id/item_wrapper_layout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_margin="@dimen/content_margin"
        Android:paddingBottom="32dp"
        Android:orientation="vertical">

        <Android.support.v7.widget.CardView
            Android:id="@+id/item_cardview"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="4dp"
            card_view:cardUseCompatPadding="true">

Ajouter le wrapper LinearLayout autour de la vue carte est ce qui a fonctionné pour moi.

Notez également que je devais ajouter card_view: cardUseCompatPadding = "true" sur la vue de la carte pour que l’ombre de la bordure soit correcte.

Voici le résultat final où la boîte rouge indique où le remplissage a été ajouté lorsque la vue de la carte est développée et défilée.

 screenshot

17
Ray Hunter

Régler clipToPadding sur false sur ScrollView fonctionne généralement pour moi:

    <ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:clipToPadding="false"
    Android:paddingBottom="16dp">

    <com.google.Android.material.card.MaterialCardView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_margin="8dp"
        app:contentPadding="8dp">

        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            tools:text="Lorem ipsum..." />

    </com.google.Android.material.card.MaterialCardView>

</ScrollView>
2
Andy

La meilleure solution consiste à ajouter enfin View avec marginTop

    <ScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fillViewport="true"> 

        <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:orientation="vertical">


      ...................
      ...................

       <View
         Android:layout_width="match_parent"
         Android:layout_height="0.1dp"
         Android:layout_marginTop="10dp"/>

   </LinearLayout>

</ScrollView>
0
PriyankVadariya

Dans mon cas, je dois simplement changer ScrollView avec NestedScrollView pour résoudre le problème.

Pour info, ma NestedScrollView est placée dans un fragment qui est un enfant de CoordinatorLayout avec appbar_scrolling_view_behavior défini.

0
Untung Suryono