View.setPadding akzeptiert nur in px. Gibt es überhaupt ein SetPadding in dp?

92

Die Android-Funktion View.setPadding(int left, int top, int right, int bottom)akzeptiert nur Werte in px, aber ich möchte die Auffüllung in dp einstellen. Gibt es einen Weg daran vorbei?

Sharj
quelle

Antworten:

184

Direkt zum Code

    int padding_in_dp = 6;  // 6 dps
    final float scale = getResources().getDisplayMetrics().density;
    int padding_in_px = (int) (padding_in_dp * scale + 0.5f);
Labeeb Panampullan
quelle
1
Hallo, ich habe eine Frage. Wird diese Formel nur zum Auffüllen oder für andere Zwecke verwendet? zB Rand oder Abmessung eines Rechtecks?
Smaragdhieu
4
Dies ist die Formel zum Konvertieren von dp-Einheiten in Pixeleinheiten . Sie können es überall verwenden
Labeeb Panampullan
2
Ich getResources()gehe davon aus, dass dies eine Funktion ist, die von einer Aktivität geerbt wird, aber ich versuche, diese Zeilen in einem benutzerdefinierten Listenansichtsadapter zu verwenden. Kann ich das auf irgendeine Weise tun, wenn ich nicht anrufen kann getResources()?
Mike Baxter
1
Führen Sie auf Ihrem Adapter einfach getContext (). GetResources (). GetDisplayMetrics (). Density aus.
Steve G.
4
Gibt es irgendwo eine Erklärung für das "+ 0.5f"?
Xavier L.
96

Wenn Sie die Dimension (in dp oder was auch immer) in einer XML-Datei definieren (was zumindest in den meisten Fällen ohnehin besser ist), können Sie den Pixelwert mithilfe dieses Codes ermitteln:

context.getResources().getDimensionPixelSize(R.dimen.your_dimension_name)
Michael Sparmann
quelle
2

Es gibt eine bessere Möglichkeit, Werte programmgesteuert in dp umzuwandeln:

int value = 200;
int dpValue = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            value,        
            context.getResources().getDisplayMetrics());

Dann wenden Sie dpValueauf Ihre Methode an, zum Beispiel:setPadding(dpValue,dpValue,dpValue,dpValue);

wapn
quelle
0

Ich habe das gleiche Problem. Die einzige Lösung, die ich gefunden habe (es wird dir nicht wirklich helfen :)), besteht darin, sie in der XML-Datei festzulegen.

Wenn Sie die Dichte aus dem Code erhalten können, können Sie die Konvertierung verwenden: "Die Konvertierung von Dip-Einheiten in Bildschirmpixel ist einfach: Pixel = Dips * (Dichte / 160)." (von http://developer.android.com/guide/practices/screens_support.html )

Bearbeiten: Sie können die Bildschirmdichte abrufen: http://developer.android.com/reference/android/util/DisplayMetrics.html#densityDpi

Khetzal
quelle