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);
ab11
la source
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.

Thomas
la source
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>
riwnodennyk
la source
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.

travaillé
la source
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);
Gorki
la source
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!

teh.fonsi
la source
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.

Chris Fei
la source
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>
développeur android
la source
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>
Francis Bacon
la source
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.
Harish Rana
la source
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)
Oleg Nekrasov
la source
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

ConcernéHobbit
la source
-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" 
Gian Gomen
la source