Wie stelle ich in Android Ränder in dp programmgesteuert ein?

Imdiese, diese unddiese thread Ich habe versucht, eine Antwort darauf zu finden, wie die Ränder in einer einzelnen Ansicht festgelegt werden. Allerdings habe ich mich gefragt, ob es keinen einfacheren Weg gibt. Ich erkläre, 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 (entweder durch Aufrufen vonsetBackgroundResource(int id) odersetBackgroundDrawable(Drawable d)), Ich möchte, dass die Ränder 0 sind. Wenn ich das nenne:

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 (habe ich bereits gelesen)Hier Wie konvertiere ich von Pixeln nach dp? Wenn ich also weiß, wie man Ränder in px einstellt, kann ich die Konvertierung selbst durchführen. Aber da heißt das in derCustomButton Klasse kann das übergeordnete Element von LinearLayout zu TableLayout variieren, und ich möchte lieber nicht, dass er sein übergeordnetes Element erhält und die Instanz dieses übergeordneten Elements überprüft. Das wird auch ziemlich inperformant sein, stelle ich mir vor.

Auch beim Aufruf (mit LayoutParams)parentLayout.addView(myCustomButton, newParams), Ich weiß nicht, ob dadurch die richtige Position hinzugefügt wird (ich habe es jedoch nicht versucht), sagen wir den mittleren Knopf einer Fünferreihe.

Frage: Gibt es eine einfachere Möglichkeit, den Rand einer einzelnen Schaltfläche programmgesteuert festzulegen?außer mit LayoutParams?

EDIT: Ich kenne den LayoutParams-Weg, aber ich möchte eine Lösung, die es vermeidet, jeden unterschiedlichen Containertyp zu handhaben:

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

weilthis.getLayoutParams();gibt a zurückViewGroup.LayoutParams, die nicht die Attribute habentopMargin, bottomMargin, leftMargin, rightMargin. Die mc-Instanz, die Sie sehen, ist nur eineMarginContainer die versetzt (-3dp) Ränder und (oml, omr, omt, omb) und die ursprünglichen Ränder (ml, mr, mt, mb) enthält.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage