¿Cómo hacer espacio entre los niños LinearLayout?

160

Estoy agregando programáticamente vistas personalizadas a un LinearLayout vertical, y me gustaría que haya algo de espacio entre las vistas. He intentado agregar: setPadding (0, 1, 0, 1) a mi constructor CustomView, pero esto no parece tener ningún efecto. ¿Algún consejo?

* Se señaló que debería usar márgenes. Como estoy agregando vistas dinámicamente, necesito establecer los márgenes desde el código (no en xml). Creo que la forma de hacerlo es a continuación, pero no funciona.

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);

*Editar. También intenté usar MarginLayoutParams como parámetro al agregar las vistas al diseño lineal (como se muestra a continuación). Esto tampoco funcionó:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
ab11
fuente
Puede ser útil si agregó el archivo XML al que desea agregar las vistas.
Dennis Winter el
2
Aquí hay una excelente publicación de blog al respecto: Grid Spacing en Android por Cyril Mottier
Richard Le Mesurier

Respuestas:

132

Deberías android:layout_margin<Side>en los niños. El acolchado es interno.

Thomas
fuente
Puede definir la vista en XML con los márgenes deseados y agregar las vistas predefinidas de manera procesal, aplicando también el contenido en código Java.
Mike Yockey
No tengo muy claro qué quieres decir con esto. ¿Debo definir la vista personalizada en xml? Pero necesitaré crear dinámicamente un número arbitrario de vistas personalizadas, que luego agregaré a mi LinearLayout.
ab11
2
Intente simplemente usar LayoutParams, no MarginLayoutParams.
Thomas
1
¿Qué atributo establecería en LinearLayout.LayoutParams? ¿Esa clase no parece tener "márgenes" o "relleno" o algo similar?
ab11
@Thomas, ¿qué quieres decir con "El relleno es interno"? ¿Debo aplicar un margen en cada uno de los componentes, que estoy tratando de evitar para minimizar los códigos duplicados (ya que tengo el mismo espacio entre los componentes de mi hijo)
OmGanesh
188

La solución API> = 11 :

Puede integrar el relleno en el divisor. En caso de que no estuvieras usando ninguno, solo crea un dibujo alto y vacío y configúralo como LinearLayoutdivisor:

    <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
fuente
Puede usarlo en API <11, si usa LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
desarrollador de Android
55
Si hace la forma como un cuadrado, puede usarla en LinearLayouts vertical y horizontal sin la necesidad de crear una nueva que tenga ancho.
WarrenFaith
2
Aquí hay una excelente publicación de blog al respecto: Grid Spacing en Android por Cyril Mottier
Richard Le Mesurier
1
Esto es mucho mejor si tiene un conjunto de vistas y activa algunas de ellas GONE. Al especificar android:showDividers="middle", solo obtendrá el espacio donde realmente lo necesita.
DariusL
@DariusL No puedo encontrar este atributo showDividers en d.android.com, ¿estás seguro de que podemos usar esto?
Henry
35

Android ahora admite agregar una vista de espacio entre vistas. Está disponible desde 4.0 ICS en adelante.

trabajó
fuente
12
Aparentemente, el Hada de Android te escuchó y creó una vista de "Espacio" en API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
Jajaja Era sólo cuestión de tiempo.
trabajó
8
pero debe hacerlo en un espacio por vista, que no es lo mismo que declarar un espacio para todas las vistas.
Lay González
^ Muy cierto. Sin embargo, si está utilizando un diseño lineal, puede agregar un divisor que se aplicará a cada vista secundaria. Ver aquí: developer.android.com/reference/android/widget/…
trabajó el
1
Esta no es una respuesta.
Stealth Rabbi
24

El siguiente ejemplo solo hace lo que necesita programáticamente. He usado un tamaño fijo de (140,398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Gorki
fuente
Lo estaba haciendo con un paso adicional como el siguiente LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); y luego button1.setLayoutParams (layoutParams); layout.addView (botón, layoutParams); .. Gracias por informarnos que addview puede tomar 2 argumentos.
png
6

Desde API Nivel 14, solo puede agregar un divisor (transparente) dibujable:

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

¡y se encargará del resto por ti!

teh.fonsi
fuente
1
¿Necesita especificar primero un divisor que se pueda dibujar o simplemente puede usarlo con nada más?
Tim Kist
8dpde donde vino esto?
Yousha Aleayoub
1
@TimKist puedes usarlo con nada más, creo
teh.fonsi
Esta respuesta es incorrecta porque android: dividerPadding no afecta la distancia entre los niños de diseño lineal. Aplica relleno a los lados del divisor que no se enfrentan a los hijos (por ejemplo, relleno izquierdo y derecho en un divisor en un diseño lineal lineal). Documentación de Android: developer.android.com/reference/android/widget/…
leorleor
2
@leorleor Tienes razón. La mejor manera es probablemente usar un divisor dibujable que sea transparente. Actualicé mi respuesta en consecuencia.
teh.fonsi
4

Usar en LinearLayout.LayoutParamslugar de MarginLayoutParams. Aquí está la documentación.

Chris Fei
fuente
¿Qué atributo establecería en LinearLayout.LayoutParams? ¿Esa clase no parece tener "márgenes" o "relleno" o algo similar?
ab11
LinearLayout.LayoutParamsse extiende MarginLayoutParamsy hereda el mismo setMargins()método que estaba utilizando arriba ...
Chris Fei
Ohhhhh, gracias! Estaba mirando: android.view.ViewGroup.LayoutParams
ab11
3

Si usa ActionBarSherlock , puede usar 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>
desarrollador de Android
fuente
2

Uso de relleno en el diseño de Vista infantil.

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
fuente
0

Puede obtener el LayoutParamsde padre LinearLayouty aplicar a las vistas individuales de esta manera:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Tenga cuidado de que setMargins () tome píxeles como tipo de datos int. Entonces, conviértalos a dp antes de agregar valores
  • El código anterior establecerá la altura y el ancho en wrap_content. Puedes personalizarlo.
Harish Rana
fuente
0

Intente agregar el widget Space después de agregar una vista como esta:

layout.addView(view)
val space = Space(context)
space.minimumHeight = spaceInterval
layout.addView(space)
Oleg Nekrasov
fuente
0

Una manera fácil de hacerlo dinámicamente es agregar relleno a los niños . Puede configurarlo usando .setPadding () en el objeto que se va a agregar. Este ejemplo es agregar un ImageView a un LinearLayout:

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

La siguiente imagen muestra dos ImageViews que se han agregado con relleno:

Acolchado En Niños

Hobit preocupado
fuente
-1

Si su diseño contiene etiquetas o algún contenedor de texto. Puede agregar al final de cada texto "\ n" para dividir una línea y hacer espacio entre los elementos.
Ejemplo:

video?.text="Video NR1: ${obj.Titulo} \n" 
Gian Gomen
fuente