java - linearlayout - set margin programmatically android view




Imposta i margini in un LinearLayout a livello di codice (7)

Sto cercando di utilizzare Java ( non XML ) per creare un LinearLayout con pulsanti che riempiono lo schermo e hanno margini. Ecco un codice che funziona senza margini:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

Quindi funziona bene, ma come diavolo dai margini dei pulsanti, quindi c'è spazio tra loro? Ho provato a usare LinearLayout.MarginLayoutParams , ma questo non ha un membro del weight quindi non va bene. E non funziona se lo passi anche lp nel suo costruttore.

È impossibile? Perché sicuramente lo guarda, e non sarebbe la prima attività di layout Android che puoi fare solo in XML.


Quindi funziona bene, ma come diavolo dai margini dei pulsanti, quindi c'è spazio tra loro?

Si chiama setMargins() sull'oggetto LinearLayout.LayoutParams .

Ho provato a usare LinearLayout.MarginLayoutParams, ma questo non ha un membro del peso quindi non va bene.

LinearLayout.LayoutParams è una sottoclasse di LinearLayout.MarginLayoutParams , come indicato nella documentation .

È impossibile?

No.

non sarebbe la prima attività di layout Android che puoi fare solo in XML

Siete invitati a fornire la prova di questo reclamo.

Personalmente, non sono a conoscenza di tutto ciò che può essere realizzato solo tramite XML e non attraverso i metodi Java nell'SDK. Di fatto, per definizione, tutto deve essere possibile tramite Java (sebbene non necessariamente tramite i metodi raggiungibili da SDK), poiché XML non è un codice eseguibile. Ma, se sei a conoscenza di qualcosa, segnalalo, perché è un bug nell'SDK che dovrebbe essere risolto un giorno.


A causa della variazione della densità dei pixel dello schermo del dispositivo, è opportuno utilizzare sempre l'unità DIP per impostare il margine a livello di codice. Come sotto_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

Spero che questo ti sia d'aiuto.


Ecco una soluzione a linea singola:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));

Ho impostato i margini direttamente utilizzando il codice seguente

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

L'unica cosa qui è notare che LayoutParams deve essere importato per il seguente pacchetto android.widget.RelativeLayout.LayoutParams , altrimenti si verificherà un errore.


Prova questo

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);

Prova questo:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

dovresti essere ware del tipo viewGroup della vista. Nel codice qui sopra, per esempio, voglio cambiare il margine di frameLayout, e il gruppo di visualizzazione di frameLayout è un RelativeLayout , quindi devi essere nascosto a (RelativeLayout.LayoutParams)







margin