web-dev-qa-db-fra.com

ScrollView ne défile pas du tout

Je ne parviens pas à faire défiler ScrollView correctement. Il coupe toujours le contenu du bas, comme s'il s'agissait d'un LinearLayout normal.

Mon code 

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fillViewport="true" >

    <LinearLayout Android:id="@+id/scroll_layout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:isScrollContainer="true"
        Android:orientation="vertical" >

Bien sûr, j'ai déjà essayé d'ajouter/supprimer les propriétés "fillViewport" et "isScrollContainer", et cela n'a rien changé du tout.

Merci d'avance.

19
thomaus

Réponse: ScrollView ne fonctionne pas lorsqu'il est utilisé comme élément racine d'une mise en page XML. Il doit être enveloppé dans un LinearLayout.

Solution alors:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <ScrollView Android:id="@+id/scroll_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:fillViewport="true" >

        <LinearLayout Android:id="@+id/scroll_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="vertical" >
21
thomaus

La réponse sélectionnée IS N'EST PAS CORRECT!

Vous POUVEZ utiliser ScrollView comme vue racine, cela ne fonctionne pas pour vous car il manque le remplissage.

Ajouter quelque chose comme:

Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:paddingBottom="@dimen/activity_vertical_margin"
3
Gutimore

supprimez le Android:isScrollContainer dans LinearLayout. Selon la documentation, Android:isScrollContainer est utilisé pour définir la vue en défilement. J'espère que ça t'aide. Référez-vous à ce link pour la définition.

2
TNR

Android Studio ajoute un NestedScrollView au fichier d'activité de certains de ses modèles (par exemple, Master-Detail). Le fait d’avoir ScrollView dans le fichier fragment et un autre dans le fichier d’activité de ce fragment empêche la vue défilement de fonctionner. Supprimer le ScrollView dans mon fichier fragment et laisser celui dans le fichier d'activité a résolu le problème pour moi.

2
Ocean

Faites défiler la vue en tant que parent n'a pas de problèmes. J'ai été confronté à ce problème lorsque nous avons ajouté padding/margin à l'enfant direct de scrollview. Conservez l'enfant de scrollview avec uniquement les propriétés height et width, cela fonctionnera parfaitement.

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

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:animateLayoutChanges="true"
            Android:orientation="vertical">
</LinearLayout>
</ScrollView>
1
Varun Chandran

Cela a résolu mon problème: j'ai ajouté Android:isScrollContainer="true" à un LinearLayout et supprimé le ScrollView Code avant:

    <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
<ScrollView
    Android:id="@+id/scrollViewRecords"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fillViewport="true">

    <LinearLayout
        Android:id="@+id/sheepList"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" >

    </LinearLayout>
</ScrollView>
</LinearLayout>

Code après

    <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:isScrollContainer="true">

    <LinearLayout
        Android:id="@+id/sheepList"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" >

    </LinearLayout>
</LinearLayout>
0
Angoranator777

Y at-il un moyen de fermer cette question? c'est vieux et actuellement la réponse marquée comme valide n'a pas de sens. La seule chose valable concernant ScrollView pour le moment est la suivante:

Un groupe de vues qui permet de faire défiler la hiérarchie de vues qui y est placée. Un seul enfant direct peut être placé dans la vue défilement. Pour ajouter plusieurs vues dans la vue de défilement, indiquez à l'enfant direct d'ajouter un groupe de vues, par exemple LinearLayout, et placez des vues supplémentaires dans ce LinearLayout . N'ajoutez jamais un RecyclerView ou un ListView à une vue de défilement. Cela se traduirait par de mauvaises performances de l'interface utilisateur et une expérience utilisateur médiocre.

Extrait de la documentation officielle: https://developer.Android.com/reference/Android/widget/ScrollView.html

0
Carlos Daniel

Essayez cette solution, il suffit de retarder votre défilement en utilisant la méthode post-différée.

fragment_test.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/rootRelativeLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    xmlns:fresco="http://schemas.Android.com/apk/res-auto">

    <ScrollView
        Android:id="@+id/scrollView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_marginTop="40dp"
        Android:fillViewport="true"
        Android:scrollbars="none">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">
            ...
        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

TestFragment.Java

...
private ScrollView mScrollView;
...
mScrollView = (ScrollView) mView.findViewById(R.id.scrollView);
mScrollView.setSmoothScrollingEnabled(true);
...
new Handler().postDelayed(new Runnable() {
    @Override
     public void run() {
         if(isAdded()) {
             // Scroll 1000px down
             mScrollView.smoothScrollTo(0, 1000);
         }
     }
}, 150);

Cela a fonctionné pour moi, espérons que cela aide.

0
Ashwin

J'ai finalement compris que cela me prenait littéralement 5 heures pour tout construire pas à pas et pour le tester à chaque étape ...

Quoi qu'il en soit, si vous avez un problème avec cela, j'ai découvert que l'écouteur setOntouch gâchait votre code - du moins dans mon cas, c'était ...

je dois trouver un moyen de contourner le problème, mais essayez de supprimer votre auditeur ontouch et de tester votre code - il doit fonctionner

0
Jani