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.