Como criar espaço entre os filhos do LinearLayout?

160

Estou adicionando programaticamente visualizações personalizadas a um LinearLayout vertical e gostaria que houvesse algum espaço entre as visualizações. Tentei adicionar: setPadding (0, 1, 0, 1) ao meu construtor CustomView, mas isso não parece ter nenhum efeito. Algum conselho?

* Foi indicado que eu deveria usar margens. Como estou adicionando visualizações dinamicamente, preciso definir as margens do código (não no xml). Acredito que a maneira de fazer isso esteja abaixo, mas não está funcionando.

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. Também tentei usar MarginLayoutParams como parâmetro enquanto adicionava as visualizações ao layout Linear (como abaixo). Isso também não funcionou:

MarginLayoutParams params = new MarginLayoutParams(linearLayout.getLayoutParams());
linearLayout.setMargins(0, 10, 0, 10);
linearLayout.addView(view, params);
ab11
fonte
Pode ser útil se você adicionou o arquivo XML ao qual deseja adicionar as visualizações.
Dennis Winter
2
Aqui está um excelente blog post sobre isso: Espaço da Grelha no Android por Cyril Mottier
Richard Le Mesurier

Respostas:

132

Você deveria android:layout_margin<Side>sobre as crianças. O preenchimento é interno.

Thomas
fonte
Você pode definir a visualização em XML com as margens desejadas e adicionar processadas as visualizações predefinidas, aplicando também o conteúdo no código Java.
Mike Yockey 23/11
Não sou muito claro sobre o que você quer dizer com isso. Eu devo definir o customview em xml? Mas vou precisar criar dinamicamente um número arbitrário de visualizações personalizadas, que adicionarei ao meu LinearLayout.
AB11
2
Tente usar LayoutParams, não MarginLayoutParams.
Thomas
1
Qual atributo eu definiria em LinearLayout.LayoutParams? Essa classe não parece ter "margens" ou "preenchimento" ou algo parecido?
AB11
@ Thomas, o que você quer dizer com "O preenchimento é interno". Devo estar aplicando a margem em cada um dos componentes, que estou meio que tentando evitar de forma a minimizar os códigos duplicados (como eu ter um espaçamento igual a ser usado entre os meus componentes filhos)
OmGanesh
188

A solução API> = 11 :

Você pode integrar o preenchimento no divisor. Caso você não esteja usando nenhum, basta criar um drawable alto vazio e defina-o 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
fonte
Você pode usá-lo na API <11, se você usar LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
desenvolvedor android
5
se você criar a forma como um quadrado, poderá usá-la em LinearLayouts verticais e horizontais sem a necessidade de criar uma nova com largura.
WarrenFaith
2
Aqui está um excelente blog post sobre isso: Espaço da Grelha no Android por Cyril Mottier
Richard Le Mesurier
1
Isso é muito melhor se você tiver um conjunto de visualizações e ativar algumas delas GONE. Ao especificar, android:showDividers="middle"você obterá apenas o espaço onde realmente precisa.
precisa saber é o seguinte
@DariusL Não consigo encontrar esse atributo showDividers em d.android.com, tem certeza de que podemos usar isso?
Henry
35

O Android agora suporta a adição de uma visualização Espaço entre as visualizações. Está disponível a partir do 4.0 ICS.

trabalhou
fonte
12
Aparentemente, o Android-Fairy escutado e criou uma visão "Space" na API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh
RI MUITO! Era apenas uma questão de tempo.
trabalhou
8
mas você precisa de um espaço por visualização, que não é o mesmo que declarar uma lacuna para todas as visualizações.
Lay González
^ Muito verdade. No entanto, se você estiver usando um LinearLayout, poderá adicionar um divisor que será aplicado a cada exibição filho. Veja aqui: developer.android.com/reference/android/widget/…
trabalhou
1
Esta não é uma resposta.
Rabino Stealth
24

A amostra abaixo faz o que você precisa programaticamente. Eu usei um tamanho fixo de (140.398).

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(140, 398);
        layoutParams.setMargins(24, 0, 24, 0);
        layout.addView(button,layoutParams);
Gorky
fonte
Eu estava fazendo isso com mais uma etapa adicional, como abaixo LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); e então button1.setLayoutParams (layoutParams); layout.addView (botão, layoutParams); .. Obrigado por informar que o addview pode receber 2 argumentos.
Png
6

Desde o nível API 14, você pode adicionar um divisor (transparente) desenhável:

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

e vai cuidar do resto para você!

teh.fonsi
fonte
1
Você precisa especificar um drawer divisor primeiro ou pode usá-lo com mais nada?
Tim Kist
8dpde onde isso veio?
Yousha Aleayoub
1
@TimKist você pode usá-lo com nada mais que eu penso
teh.fonsi
Esta resposta está incorreta porque android: dividerPadding não afeta a distância entre os filhos de layout linear. Aplica preenchimento nas laterais do divisor que não estão voltadas para as crianças (por exemplo, preenchimento esquerdo e direito em um divisor em um LinearLayout vertical). Documentação do Android: developer.android.com/reference/android/widget/…
leorleor
2
@leorleor Você está certo. A melhor maneira é provavelmente usar um divisor que seja transparente. Eu atualizei minha resposta de acordo.
Te # fonsi #
4

Use em LinearLayout.LayoutParamsvez de MarginLayoutParams. Aqui está a documentação.

Chris Fei
fonte
Qual atributo eu definiria em LinearLayout.LayoutParams? Essa classe não parece ter "margens" ou "preenchimento" ou algo parecido?
AB11
LinearLayout.LayoutParamsestende-se MarginLayoutParamse herda o mesmo setMargins()método que você estava usando acima ...
Chris Fei
Ohhhhh, obrigada! Eu estava olhando para: android.view.ViewGroup.LayoutParams
ab11
3

Se você usar o ActionBarSherlock , poderá 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>
desenvolvedor android
fonte
2

Usando o preenchimento no layout do Child View.

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

Você pode obter o LayoutParamspai LinearLayoute aplicar às visualizações individuais desta maneira:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Certifique-se de que setMargins () receba pixels como tipo de dados int. Portanto, converta para dp antes de adicionar valores
  • O código acima definirá altura e largura para wrap_content. você pode personalizá-lo.
Harish Rana
fonte
0

Tente adicionar o widget Space depois de adicionar a visualização da seguinte forma:

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

Uma maneira fácil de fazer isso dinamicamente é adicionar preenchimento às crianças . Você pode configurá-lo usando .setPadding () no objeto a ser adicionado. Este exemplo está adicionando um ImageView a um LinearLayout:

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

A imagem a seguir mostra dois ImageViews que foram adicionados com preenchimento:

Estofamento em crianças

ConcernedHobbit
fonte
-1

Se o seu layout contiver etiquetas ou algum contêiner para texto. Você pode adicionar no final de cada texto "\ n" para dividir uma linha e criar espaço entre os elementos.
Exemplo:

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