web-dev-qa-db-fra.com

Android ScrollView définir la hauteur pour le contenu affiché

J'ai beaucoup de mal à essayer de résoudre le problème d'avoir une zone de défilement à hauteur statique dans une mise en page. J'ai trois longues listes qui doivent être affichées sur le même écran et il serait tout à fait impossible d'afficher toutes les entrées séquentiellement, car si vous voulez ignorer une catégorie, vous devez faire défiler éventuellement des centaines d'entrées.

Supposons que j'ai une vue de défilement avec une disposition linéaire à l'intérieur, je veux que cela prenne, par exemple, une hauteur de 250dp sur l'écran au maximum et puisse défiler indépendamment une fois rempli avec plus d'entrées que ce qui peut tenir dans l'espace de 250dp.

Ce que j'ai maintenant c'est:

<ScrollView
    Android:minWidth="25px"
    Android:minHeight="150px"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/XXXXXXX"
    Android:scrollbars="vertical">

    <LinearLayout
        Android:orientation="vertical"
        Android:minWidth="25px"
        Android:minHeight="25px"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/XXXXXX" />
</ScrollView>

Lorsqu'ils sont remplis, la vue de défilement et la présentation linéaire s'étirent aussi longtemps qu'ils doivent s'adapter au contenu et l'affiche entièrement à la place d'avoir une "fenêtre" de 250dp/px (toute mesure serait agréable) avec le contenu défilable en son sein.

Je suis nouveau sur la plate-forme Android, alors peut-être que la réponse est évidente et je ne comprenais tout simplement pas la langue, mais toute aide serait grandement appréciée! Merci

--- RÉSOLU: placez un linearLayout en dehors de ScrollView avec la hauteur.

12
user2150445

Vous avez besoin d'un maxHeight. Mais comme les vues ne le prennent pas en charge, vous devez utiliser une solution de contournement.

Découvrez cette réponse:

https://stackoverflow.com/a/13811461/770467

3
Androiderson

Avec l'aide de this réponse, j'ai réussi à conclure un composant ScrollView très basique que vous pouvez utiliser dans ce cas:

Créez une classe personnalisée étendant un ScrollView et effectuez les modifications suivantes:

public class MaxHeightScrollView extends ScrollView {

    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        super(context);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.Lollipop)
    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a default value
            styledAttrs.recycle();
        }
    }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
}

Et puis une chose mineure est de déclarer votre styleable dans le fichier attrs.xml de votre dossier de valeurs (si vous n'en avez pas, créez simplement un fichier xml avec ce nom dans le dossier de valeurs du dossier res de votre projet). Ajoutez-y les lignes suivantes:

<declare-styleable name="MaxHeightScrollView">
    <attr name="maxHeight" format="dimension" />
</declare-styleable>

Et utilisez votre nouveau ScrollView comme suit:

<com.yourpackage.MaxHeightScrollView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:maxHeight="300dp">
</com.yourpackage.MaxHeightScrollView>

Les crédits vont à whizzle pour terminer rapidement!

18
Mike

Ma solution simple.
Définissez ScrollView heigh en xml:

Android:layout_height="wrap_content"

Ajoutez ce code pour définir la hauteur maximale sur 200 si la hauteur mesurée actuelle est> 200

sv.measure(0, 0);
if (nsv.getMeasuredHeight() > 200) {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                      ViewGroup.LayoutParams.MATCH_PARENT, 200);
        sv.setLayoutParams(lp);
}

ScrollView dans mon exemple est dans LinearLayout, j'ai donc utilisé LinearLayout.LayoutParams.

2
Volodymyr Kulyk

Ajoutez une disposition autour de votre ScrollView à hauteur fixe

0
Denys Lobur