Comment faire de l'espace entre les enfants LinearLayout?


160

J'ajoute par programme des vues personnalisées à un LinearLayout vertical, et j'aimerais qu'il y ait un espace entre les vues. J'ai essayé d'ajouter: setPadding (0, 1, 0, 1) à mon constructeur CustomView, mais cela ne semble pas avoir d'effet. Aucun conseil?

* Il a été souligné que je devrais utiliser des marges. Puisque j'ajoute dynamiquement des vues, je dois définir les marges à partir du code (pas en xml). Je pense que la façon de procéder est ci-dessous, mais cela ne fonctionne pas.

public class MyView extends View
{
    public MyView (Context context)
    {
        super(context);

        MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 10, 0, 10);
        setLayoutParams(params);

*Éditer. J'ai également essayé d'utiliser MarginLayoutParams comme paramètre tout en ajoutant les vues à la disposition linéaire (comme ci-dessous). Cela n'a pas non plus fonctionné:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);

Cela peut aider si vous avez ajouté le fichier XML auquel vous souhaitez ajouter les vues.
Dennis Winter

2
Voici un excellent article de blog à ce sujet: Grid Spacing sur Android par Cyril Mottier
Richard Le Mesurier

Réponses:


132

Vous devriez android:layout_margin<Side>sur les enfants. Le rembourrage est interne.


Vous pouvez définir la vue en XML avec les marges souhaitées et ajouter les vues prédéfinies de manière procédurale, en appliquant également le contenu dans le code Java.
Mike Yockey

Je ne comprends pas vraiment ce que vous entendez par là. Dois-je définir la vue personnalisée en xml? Mais je devrai créer dynamiquement un nombre arbitraire de vues personnalisées, que je vais ensuite ajouter à mon LinearLayout.
11

2
Essayez simplement d'utiliser LayoutParams et non MarginLayoutParams.
Thomas

1
Quel attribut définirais-je dans LinearLayout.LayoutParams? Cette classe ne semble pas avoir de «marges» ou de «remplissage» ou quelque chose de similaire?
11

@Thomas qu'entendez-vous par "Le rembourrage est interne". Dois-je appliquer une marge dans chacun des composants, ce que j'essaie en quelque sorte d'éviter afin de minimiser les codes en double (car j'ai un espacement égal à utiliser entre mes composants enfants)
OmGanesh

188

La solution API> = 11 :

Vous pouvez intégrer le rembourrage dans le diviseur. Si vous n'en utilisez aucun, créez simplement un grand dessin vide et définissez-le comme LinearLayoutdiviseur de:

    <LinearLayout
            android:showDividers="middle"
            android:divider="@drawable/empty_tall_divider"
...>...</LinearLayout>

empty_tall_divider.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
            android:height="40dp"
            android:width="0dp"/>
</shape>

Vous pouvez l'utiliser sur l'API <11, si vous utilisez LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
développeur android

5
si vous faites la forme comme un carré, vous pouvez l'utiliser dans des mises en page linéaires verticales et horizontales sans avoir besoin d'en créer une nouvelle qui a une largeur.
WarrenFaith

2
Voici un excellent article de blog à ce sujet: Grid Spacing sur Android par Cyril Mottier
Richard Le Mesurier

1
C'est beaucoup mieux si vous avez un ensemble de vues et que vous en activez certaines GONE. En spécifiant, android:showDividers="middle"vous n'obtiendrez que l'espace où vous en avez réellement besoin.
DariusL

@DariusL Je ne trouve pas cet attribut showDividers dans d.android.com, êtes-vous sûr que nous pouvons l'utiliser?
Henry

35

Android prend désormais en charge l'ajout d'une vue d' espace entre les vues. Il est disponible à partir de 4.0 ICS.


12
Apparemment, Android-Fairy vous a écouté et a créé une vue "Espace" dans l'API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh

LOL! Ce n'était qu'une question de temps.
travaillé

8
mais vous avez besoin d'un espace par vue, ce qui n'est pas la même chose que de déclarer un espace pour toutes les vues.
Lay González

^ Très vrai. Cependant, si vous utilisez un LinearLayout, vous pouvez ajouter un diviseur qui sera appliqué à chaque vue enfant. Vois ici: developer.android.com/reference/android/widget/…
travaillé

1
Ce n'est pas une réponse.
Rabbin furtif

24

L'exemple ci-dessous fait simplement ce dont vous avez besoin par programme. J'ai utilisé une taille fixe de (140 398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);

Je le faisais avec une étape supplémentaire comme ci-dessous LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); puis button1.setLayoutParams (layoutParams); layout.addView (bouton, layoutParams); .. Merci d'avoir fait savoir que addview peut prendre 2 arguments.
png

6

Depuis le niveau d'API 14, vous pouvez simplement ajouter un diviseur (transparent) dessinable:

android:divider="@drawable/divider"
android:showDividers="middle"

et il s'occupera du reste pour vous!


1
Avez-vous besoin de spécifier un diviseur dessinable en premier ou pouvez-vous simplement l'utiliser avec rien d'autre?
Tim Kist

8dpd'où cela vient-il?
Yousha Aleayoub

1
@TimKist vous pouvez l'utiliser avec rien d'autre je pense
teh.fonsi

Cette réponse est incorrecte car android: dividerPadding n'affecte pas la distance entre les enfants de disposition linéaire. Il applique un remplissage aux côtés du séparateur qui ne font pas face aux enfants (par exemple, un remplissage gauche et droit sur un diviseur dans un LinearLayout vertical). Documentation Android: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor Vous avez raison. Le meilleur moyen est probablement d'utiliser un diviseur dessinable qui est transparent. J'ai mis à jour ma réponse en conséquence.
teh.fonsi

4

Utilisez à la LinearLayout.LayoutParamsplace de MarginLayoutParams. Voici la documentation.


Quel attribut définirais-je dans LinearLayout.LayoutParams? Cette classe ne semble pas avoir de «marges» ou de «remplissage» ou quelque chose de similaire?
11

LinearLayout.LayoutParamsétend MarginLayoutParamset il hérite de la même setMargins()méthode que vous utilisiez ci-dessus ...
Chris Fei

Ohhhhh, merci! Je regardais: android.view.ViewGroup.LayoutParams
ab11

3

Si vous utilisez ActionBarSherlock , vous pouvez utiliser com.actionbarsherlock.internal.widget.IcsLinearLayout:

<com.actionbarsherlock.internal.widget.IcsLinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_view_divider"
        android:dividerPadding="2dp"
        android:showDividers="middle" >
...
</com.actionbarsherlock.internal.widget.IcsLinearLayout>

2

Utilisation du remplissage dans la disposition de la vue enfant.

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="5dp"
          android:background="@drawable/backage_text"
          android:textColor="#999999"
           >

</TextView>

backage_text.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="2dp"/>
    <stroke
        android:width="1dp"
        android:color="#999999"/>
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

0

Vous pouvez obtenir le LayoutParamsparent de LinearLayoutet appliquer aux vues individuelles de cette façon:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Veillez à ce que setMargins () prenne les pixels comme type de données int. Ainsi, convertissez-les en dp avant d'ajouter des valeurs
  • Le code ci-dessus définira la hauteur et la largeur sur wrap_content. vous pouvez le personnaliser.

0

Essayez d'ajouter un widget Espace après avoir ajouté une vue comme celle-ci:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)

0

Un moyen simple de le faire de manière dynamique consiste à ajouter un remplissage aux enfants . Vous pouvez simplement le définir en utilisant .setPadding () sur l'objet à ajouter. Cet exemple ajoute un ImageView à un LinearLayout:

LinearLayout userFeedLinearLayout = (LinearLayout) findViewById(R.id.userFeedLinearLayout);
imageView.setImageBitmap(bitmap);
imageView.setPadding(0, 30, 0, 30);
userFeedLinearLayout.addView(imageView);

L'image suivante montre deux ImageViews qui ont été ajoutées avec un remplissage:

Rembourrage sur les enfants


-1

Si votre mise en page contient des étiquettes ou un conteneur pour le texte. Vous pouvez ajouter à la fin de chaque texte "\ n" pour diviser une ligne et faire de l'espace entre les éléments.
Exemple:

video?.text="Video NR1: ${obj.Titulo} \n" 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.