it-swarm.com.de

Stellen Sie die Ränder in einem LinearLayout programmgesteuert ein

Ich versuche, mit Java (nicht XML) ein LinearLayout mit Schaltflächen zu erstellen, die den Bildschirm ausfüllen und Ränder haben. Hier ist Code, der ohne Ränder funktioniert:

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

Das funktioniert also gut, aber wie um alles in der Welt geben Sie den Knöpfen Ränder, damit zwischen ihnen Platz ist? Ich habe versucht, LinearLayout.MarginLayoutParams Zu verwenden, aber das hat kein weight Mitglied, also ist es nicht gut. Und es funktioniert auch nicht, wenn Sie es lp in seinem Konstruktor übergeben.

Ist das unmöglich? Weil es so aussieht und es nicht die erste Android Layout-Aufgabe ist, die Sie nur in XML ausführen können.

258
Timmmm

Hier ist ein kleiner Code, um dies zu erreichen:

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);
483
Mauro

Das funktioniert also gut, aber wie um alles in der Welt geben Sie den Knöpfen Ränder, damit zwischen ihnen Platz ist?

Sie rufen setMargins() für das Objekt LinearLayout.LayoutParams Auf.

Ich habe versucht, mit LinearLayout.MarginLayoutParams, aber das hat kein Gewicht Mitglied, so ist es nicht gut.

LinearLayout.LayoutParams Ist eine Unterklasse von LinearLayout.MarginLayoutParams, Wie in der Dokumentation angegeben .

Ist das unmöglich?

Nein.

es wäre nicht die erste Android Layoutaufgabe, die Sie nur in XML ausführen können

Gerne können Sie den Nachweis dieser Behauptung erbringen.

Persönlich ist mir nichts bekannt, was nur über XML und nicht über Java - Methoden im SDK erreicht werden kann. Tatsächlich muss per Definition alles über Java möglich sein (allerdings nicht unbedingt über SDK-erreichbare Methoden), da XML kein ausführbarer Code ist. Wenn Ihnen jedoch etwas bekannt ist, weisen Sie darauf hin, da dies ein Fehler im SDK ist, der eines Tages behoben werden sollte.

62
CommonsWare

So fügen Sie Ränder direkt zu Elementen hinzu (einige Elemente ermöglichen die direkte Bearbeitung von Rändern):

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

... dies funktioniert, ohne das umgebende Layout kennen/bearbeiten zu müssen. Beachten Sie das Kontrollkästchen "instanceof", falls Sie versuchen, dies für etwas auszuführen, das keine Ränder unterstützt.

30
Adam

Aufgrund der unterschiedlichen Pixeldichten auf dem Bildschirm des Geräts empfiehlt es sich, immer die Einheit DIP zu verwenden, um den Rand programmgesteuert festzulegen. Wie unten_

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

Hoffe das wird helfen.

21
Rupesh Yadav

Ich habe die Ränder direkt unter Verwendung des folgenden Codes festgelegt

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

Hier ist nur zu beachten, dass LayoutParams für das folgende Paket importiert werden soll Android.widget.RelativeLayout.LayoutParams, sonst tritt ein Fehler auf.

10
Janith
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
7
Ginni

Versuche dies

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

Versuche dies:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
4
Makvin
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

sie sollten vom Typ viewGroup der Ansicht sein. Im obigen Code möchte ich beispielsweise den Rand des FrameLayouts ändern, und die Ansichtsgruppe des FrameLayouts ist ein RelativeLayout ,, sodass Sie verbergen müssen (RelativeLayout.LayoutParams)

3
Francis Shi

Hier eine einzeilige Lösung:

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