Come fare spazio tra i bambini LinearLayout?


160

Sto aggiungendo programmaticamente viste personalizzate a un LinearLayout verticale e vorrei che ci fosse dello spazio tra le viste. Ho provato ad aggiungere: setPadding (0, 1, 0, 1) al mio costruttore CustomView, ma questo non sembra avere alcun effetto. Qualche consiglio?

* È stato sottolineato che dovrei usare i margini. Dato che sto aggiungendo dinamicamente le viste, devo impostare i margini dal codice (non in xml). Credo che il modo per farlo sia di seguito, ma non funziona.

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

*Modificare. Ho anche provato a utilizzare MarginLayoutParams come parametro durante l'aggiunta delle viste al layout lineare (come di seguito). Anche questo non ha funzionato:

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

Potrebbe essere utile se hai aggiunto il file XML a cui desideri aggiungere le visualizzazioni.
Dennis Winter,

2
Ecco un eccellente post sul blog a riguardo: Grid Spacing su Android di Cyril Mottier
Richard Le Mesurier

Risposte:


132

Dovresti android:layout_margin<Side>sui bambini. L'imbottitura è interna.


È possibile definire la vista in XML con i margini desiderati e aggiungere le viste predefinite in modo procedurale, applicando anche il contenuto nel codice Java.
Mike Yockey,

Non sono molto chiaro su cosa intendi con questo. Dovrei definire la visualizzazione personalizzata in XML? Ma dovrò creare dinamicamente un numero arbitrario di viste personalizzate, che aggiungerò quindi al mio LinearLayout.
ab11,

2
Prova solo a utilizzare LayoutParams non MarginLayoutParams.
Thomas,

1
Quale attributo dovrei impostare in LinearLayout.LayoutParams? Quella classe non sembra avere "margini" o "imbottitura" o qualcosa di simile?
ab11,

Thomas, cosa intendi con "Imbottitura interna". Dovrei applicare margine in ciascuno dei componenti, che sto cercando di evitare in modo da ridurre al minimo i codici duplicati (poiché ho lo stesso spazio da utilizzare tra i miei componenti figlio)
OmGanesh

188

L' API> = 11 soluzione:

È possibile integrare l'imbottitura nel divisore. Nel caso in cui non ne usassi nessuno, crea un disegno alto vuoto e impostalo come LinearLayoutdivisore:

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

Puoi usarlo su API <11, se usi LinearLayoutCompat: developer.android.com/reference/android/support/v7/widget/…
sviluppatore Android

5
se rendi la forma come un quadrato, puoi usarla in LinearLayout verticali e orizzontali senza la necessità di crearne una nuova che abbia larghezza.
WarrenFaith,

2
Ecco un eccellente post sul blog a riguardo: Grid Spacing su Android di Cyril Mottier
Richard Le Mesurier

1
Questo è molto meglio se hai una serie di viste e ne giri alcune GONE. Specificando android:showDividers="middle"otterrai solo lo spazio in cui ne hai effettivamente bisogno.
Dario

@DariusL Non riesco a trovare questo attributo showDividers in d.android.com, sei sicuro che possiamo usarlo?
Henry,

35

Android ora supporta l'aggiunta di una vista Spazio tra le viste. È disponibile da 4.0 ICS in poi.


12
Apparentemente Android-Fairy ti ha ascoltato e creato una vista "Spazio" nell'API 14 :) ( developer.android.com/reference/android/widget/Space.html )
shaylh,

LOL! Era solo una questione di tempo.
funzionato

8
ma è necessario uno spazio per vista, che non è lo stesso di dichiarare uno spazio per tutte le viste.
Lay González,

^ Molto vero. Tuttavia, se si utilizza un LinearLayout, è possibile aggiungere un divisore che verrà applicato a ciascuna vista figlio. Vedi qui: developer.android.com/reference/android/widget/…
funzionato il

1
Questa non è una risposta
Stealth Rabbi

24

L'esempio seguente fa semplicemente ciò di cui hai bisogno a livello di programmazione. Ho usato una dimensione fissa di (140.398).

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

Lo stavo facendo con un altro passo aggiuntivo come sotto LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (140, 398); layoutParams.setMargins (24, 0, 24, 0); e poi button1.setLayoutParams (layoutParams); layout.addView (pulsante, layoutParams); .. Grazie per aver fatto sapere che addview può accettare 2 argomenti.
png

6

Dal livello API 14 puoi semplicemente aggiungere un divisibile (trasparente) divisibile:

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

e gestirà il resto per te!


1
Devi prima specificare un disegno divisibile per divisori o puoi usarlo con nient'altro?
Tim Kist,

8dpda dove viene?
Yousha Aleayoub,

1
@TimKist puoi usarlo con nient'altro penso
teh.fonsi il

Questa risposta non è corretta perché android: dividerPadding non influenza la distanza tra i bambini con layout lineare. Applica un'imbottitura ai lati del divisore che non sono rivolti verso i bambini (ad es. Imbottitura sinistra e destra su un divisore in un layout lineare verticale). Documentazione Android: developer.android.com/reference/android/widget/…
leorleor

2
@leorleor Hai ragione. Il modo migliore è probabilmente usare un divisibile divisibile che sia trasparente. Ho aggiornato la mia risposta di conseguenza.
teh.fonsi,

4

Usa LinearLayout.LayoutParamsinvece di MarginLayoutParams. Ecco la documentazione


Quale attributo dovrei impostare in LinearLayout.LayoutParams? Quella classe non sembra avere "margini" o "imbottitura" o qualcosa di simile?
ab11,

LinearLayout.LayoutParamssi estende MarginLayoutParamsed eredita lo stesso setMargins()metodo che stavi usando sopra ...
Chris Fei,

Ohhhhh, grazie! Stavo guardando: android.view.ViewGroup.LayoutParams
ab11

3

Se usi ActionBarSherlock , puoi usare 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

Utilizzo dell'imbottitura nel layout di Vista figlio.

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

È possibile ottenere il LayoutParamsgenitore LinearLayoute applicare alle singole visualizzazioni in questo modo:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(8,8,8,8);
  • Assicurati che setMargins () prenda i pixel come tipo di dati int. Quindi, converti in dp prima di aggiungere valori
  • Il codice sopra imposta altezza e larghezza su wrap_content. puoi personalizzarlo.

0

Prova ad aggiungere il widget Spazio dopo aver aggiunto la vista in questo modo:

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

0

Un modo semplice per farlo in modo dinamico è aggiungere imbottitura ai bambini . Puoi semplicemente impostarlo usando .setPadding () sull'oggetto da aggiungere. In questo esempio si aggiunge un ImageView a un LinearLayout:

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

L'immagine seguente mostra due visualizzazioni di immagini che sono state aggiunte con il riempimento:

Imbottitura Sui Bambini


-1

Se il layout contiene etichette o un contenitore per il testo. È possibile aggiungere alla fine di ogni testo "\ n" per dividere una linea e creare spazio tra gli elementi.
Esempio:

video?.text="Video NR1: ${obj.Titulo} \n" 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.