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)