In diesem , diesem und diesem Thread habe ich versucht, eine Antwort darauf zu finden, wie die Ränder in einer einzelnen Ansicht festgelegt werden. Ich habe mich jedoch gefragt, ob es keinen einfacheren Weg gibt. Ich werde erklären, warum ich diesen Ansatz lieber nicht verwenden möchte:
Ich habe einen benutzerdefinierten Button, der den Button erweitert. Wenn der Hintergrund auf etwas anderes als den Standardhintergrund eingestellt ist (durch Aufrufen von entweder setBackgroundResource(int id)
oder setBackgroundDrawable(Drawable d)
), möchte ich, dass die Ränder 0 sind. Wenn ich dies aufrufe:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Ich möchte, dass die Ränder auf -3dp zurückgesetzt werden (ich habe hier bereits gelesen , wie man von Pixeln in dp konvertiert. Wenn ich also weiß, wie man Ränder in px festlegt, kann ich die Konvertierung selbst verwalten). Da dies jedoch in der CustomButton
Klasse aufgerufen wird , kann das übergeordnete Element von LinearLayout zu TableLayout variieren, und ich möchte lieber nicht, dass er sein übergeordnetes Element abruft und die Instanz dieses übergeordneten Elements überprüft. Das wird auch ziemlich unperformant sein, stelle ich mir vor.
Außerdem parentLayout.addView(myCustomButton, newParams)
weiß ich beim Aufrufen (mit LayoutParams) nicht, ob dies die richtige Position hinzufügt (habe es jedoch nicht versucht), beispielsweise die mittlere Schaltfläche einer Fünferreihe.
Frage: Gibt es eine einfachere Möglichkeit, den Rand einer einzelnen Schaltfläche programmgesteuert festzulegen, als LayoutParams zu verwenden?
BEARBEITEN: Ich kenne die LayoutParams-Methode, möchte aber eine Lösung, die es vermeidet, jeden einzelnen Containertyp zu behandeln:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Da this.getLayoutParams();
kehrt ein ViewGroup.LayoutParams
, die nicht die Eigenschaften haben topMargin
, bottomMargin
, leftMargin
, rightMargin
. Die mc-Instanz, die Sie sehen, ist nur eine, MarginContainer
die versetzte (-3dp) Ränder und (oml, omr, omt, omb) und die ursprünglichen Ränder (ml, mr, mt, mb) enthält.
LayoutParams - NICHT ARBEITEN! ! !
Benötigen Sie Verwendung Typ von: MarginLayoutParams
Codebeispiel für MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
quelle
Button
Ansicht:ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()
kehrt zurücknull
Bester Weg aller Zeiten:
So rufen Sie die Methode auf:
Hoffe das wird dir helfen.
quelle
Dann
Oder
quelle
Hier ist die All-in-One-Antwort mit den neuesten Updates:
Schritt 1, um den Rand zu aktualisieren
Die Grundidee ist, die Marge herauszuholen und sie dann zu aktualisieren. Das Update wird automatisch angewendet und muss nicht zurückgesetzt werden. Um die Layoutparameter zu erhalten, rufen Sie einfach diese Methode auf:
Das
LayoutParams
kommt aus dem Layout Ihrer Ansicht. Wenn die Ansicht aus einem linearen Layout stammt, müssen Sie sie importierenLinearLayout.LayoutParams
. Wenn Sie relatives Layout, ImportLinearLayout.LayoutParams
usw. verwenden.Nun, wenn Sie den Rand mit eingestellt
Layout_marginLeft
,Right
etc, müssen Sie Update - Marge auf diese WeiseWenn Sie den Rand mit dem neuen festlegen
layout_marginStart
, müssen Sie den Rand auf diese Weise aktualisierenSchritt 2, um den Rand in dp zu aktualisieren
Alle zwei oben beschriebenen Möglichkeiten zum Aktualisieren des Randes werden in Pixel aktualisiert. Sie müssen eine Übersetzung von dp in Pixel durchführen.
Setzen Sie nun den berechneten Wert auf die obigen Randaktualisierungsfunktionen und Sie sollten alle eingestellt sein
quelle
layout_margin ist eine Einschränkung, die ein untergeordnetes Ansichtselement seinem übergeordneten Element mitteilt. Es ist jedoch die Aufgabe der Eltern, zu entscheiden, ob eine Marge zulässig ist oder nicht. Grundsätzlich fordert das Kind durch Setzen von android: layout_margin = "10dp" die übergeordnete Ansichtsgruppe auf, Speicherplatz zuzuweisen, der 10dp größer als die tatsächliche Größe ist. (padding = "10dp" bedeutet andererseits, dass die untergeordnete Ansicht ihren eigenen Inhalt um 10dp verkleinert .)
Folglich respektieren nicht alle ViewGroups die Marge . Das berüchtigtste Beispiel wäre die Listenansicht, bei der die Ränder von Elementen ignoriert werden. Bevor Sie
setMargin()
ein LayoutParam aufrufen, sollten Sie immer sicherstellen, dass sich die aktuelle Ansicht in einer ViewGroup befindet, die den Rand unterstützt (z. B. LinearLayouot oder RelativeLayout), und das ErgebnisgetLayoutParams()
in die gewünschten LayoutParams umwandeln. (ViewGroup.LayoutParams
hat nicht einmalsetMargins()
Methode!)Die folgende Funktion sollte den Trick machen. Stellen Sie jedoch sicher, dass Sie RelativeLayout durch den Typ der übergeordneten Ansicht ersetzen.
quelle
Mit dieser Methode können Sie den Rand in DP festlegen
AKTUALISIEREN
Sie können den Parameter ändern, der Ihren Anforderungen entspricht.
quelle
In Kotlin wird es so aussehen:
quelle
Wenn Sie sich in einer benutzerdefinierten Ansicht befinden, können Sie
getDimensionPixelSize(R.dimen.dimen_value)
in meinem Fall den Rand in LayoutParams hinzufügen, der mit derinit
Methode erstellt wurde.In Kotlin
in Java:
quelle
Verwenden Sie diese Methode, um den Rand in dp festzulegen
Rufen Sie die Methode auf:
quelle
Für eine schnelle einzeilige Einrichtung verwenden
Seien Sie jedoch vorsichtig, wenn Sie LayoutParams falsch verwenden, da dies keine
if
Statment-Instanz chech enthältquelle
Erstellt eine Kotlin-Erweiterungsfunktion für diejenigen unter Ihnen, die sie möglicherweise nützlich finden.
Stellen Sie sicher, dass Sie Pixel nicht dp übergeben. Viel Spaß beim Codieren :)
quelle
In meinem Beispiel füge ich einem LinearLayout programmgesteuert eine ImageView hinzu. Ich habe den oberen und unteren Rand auf ImagerView gesetzt. Fügen Sie dann die ImageView zum LinearLayout hinzu.
quelle
Sie können diese Methode verwenden und statische Abmessungen wie 20 setzen, die entsprechend Ihrem Gerät konvertiert werden
quelle
Nach wie vor ist es wahrscheinlich am besten, Paris zu nutzen , eine von AirBnB bereitgestellte Bibliothek.
Stile können dann folgendermaßen angewendet werden:
Es unterstützt auch die benutzerdefinierte Ansicht (wenn Sie eine Ansicht erweitern) mithilfe von Anmerkungen:
quelle
Du musst anrufen
wie so:
your_view.setPadding(0,16,0,0)
Was Sie versuchen zu verwenden, ist nur der Getter.
Android Studio zeigt, was
padding...()
in Java eigentlich bedeutet:Auffüllbeispiel Das Bild zeigt, dass nur Anrufe getätigt werden
getPadding...()
Wenn Sie Ihrer Textansicht einen Rand hinzufügen möchten, müssen Sie LayoutParams ausführen:
quelle
Ich musste meine
FrameLayout
für ein lineares Layout umwandeln, da es davon erbt, und dort Ränder festlegen, damit die Aktivität nur auf einem Teil des Bildschirms zusammen mit einem anderen Hintergrund als den ursprünglichen Layoutparametern im angezeigt wirdsetContentView
.Keiner der anderen arbeitete daran, dieselbe Aktivität zu verwenden und die Ränder zu ändern, indem die Aktivität aus einem anderen Menü geöffnet wurde! setLayoutParams hat bei mir nie funktioniert - das Gerät stürzte jedes Mal ab. Obwohl es sich um fest codierte Zahlen handelt, ist dies nur ein Beispiel für den Code, der nur zu Demonstrationszwecken dient.
quelle
Sie können
ViewGroup.MarginLayoutParams
damit Breite, Höhe und Ränder einstellenDabei nimmt die Methode
setMargins();
Werte für links, oben, rechts und unten an. Im Uhrzeigersinn!, Von links beginnend.quelle