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.
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" >
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"
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.
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.
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>
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>
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
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.
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