538 Stimmen

Wie kann ich in Android die Ränder in dp programmatisch einstellen?

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.

969voto

throrin19 Punkte 17074

Sie sollten Folgendes verwenden LayoutParams um die Ränder Ihrer Schaltflächen festzulegen:

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

Je nachdem, welches Layout Sie verwenden, sollten Sie RelativeLayout.LayoutParams o LinearLayout.LayoutParams .

Um Ihr dp-Maß in Pixel umzurechnen, versuchen Sie Folgendes:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);

292voto

Lyusten Elder Punkte 3163

LayoutParams - Funktioniert nicht! ! !

Benötigen Sie die Art der Verwendung: MarginLayoutParams

MarginLayoutParams params = (MarginLayoutParams) vector8.getLayoutParams();
params.width = 200; params.leftMargin = 100; params.topMargin = 200;

Codebeispiel für MarginLayoutParams:

http://www.codota.com/Android/classes/Android.view.ViewGroup.MarginLayoutParams

155voto

Hiren Patel Punkte 50526

Der beste Weg überhaupt:

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        p.setMargins(left, top, right, bottom);
        view.requestLayout();
    }
}

Wie man die Methode aufruft:

setMargins(mImageView, 50, 50, 50, 50);

Ich hoffe, das hilft Ihnen weiter.

50voto

Renato Probst Punkte 5557
int sizeInDP = 16;

int marginInDp = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources()
                    .getDisplayMetrics());

Dann

layoutParams = myView.getLayoutParams()
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);

Oder

LayoutParams layoutParams = new LayoutParams...
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);

49voto

Phil Punkte 4321

Avec Android KTX können Sie so etwas tun:

yourView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(0, 0, 0, 0)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X