Unter este , este y este Thread habe ich versucht, eine Antwort auf die Frage zu finden, wie man die Ränder einer einzelnen Ansicht einstellen kann. Ich habe mich jedoch gefragt, ob es nicht einen einfacheren Weg gibt. Ich werde erklären, warum ich diesen Ansatz lieber nicht verwenden möchte:
Ich habe eine benutzerdefinierte Schaltfläche, die Button erweitert. Wenn der Hintergrund auf etwas anderes als den Standardhintergrund gesetzt wird (entweder durch den Aufruf von setBackgroundResource(int id)
o 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 bereits gelesen ici wie man von Pixeln in dp konvertiert, so dass ich, sobald ich weiß, wie man Ränder in px einstellt, die Konvertierung selbst vornehmen kann). Aber da dies in der Datei CustomButton
Klasse kann das Elternteil von LinearLayout zu TableLayout variieren, und ich möchte nicht, dass er sein Elternteil erhält und die Instanz dieses Elternteils überprüft. Das wird auch ziemlich inperformant sein, denke ich.
Auch beim Aufruf (mit LayoutParams) parentLayout.addView(myCustomButton, newParams)
Ich weiß nicht, ob sie dadurch an der richtigen Stelle eingefügt wird (ich habe es noch nicht ausprobiert), z. B. an der mittleren Taste einer Fünferreihe.
Frage: Gibt es eine einfachere Möglichkeit, den Rand eines einzelnen Buttons programmatisch zu setzen? außer der Verwendung von LayoutParams?
EDIT: Ich weiß, der LayoutParams Weg, aber ich möchte eine Lösung, die vermeidet, jede unterschiedliche Container-Typ 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);
}
}
Denn this.getLayoutParams();
gibt eine ViewGroup.LayoutParams
die nicht über die Attribute topMargin
, bottomMargin
, leftMargin
, rightMargin
. Die mc-Instanz, die Sie sehen, ist nur eine MarginContainer
die versetzte (-3dp) Ränder und (oml, omr, omt, omb) sowie die ursprünglichen Ränder (ml, mr, mt, mb) enthält.