427 Stimmen

Dimensionswert aus res/values/dimension.xml aus dem Quellcode laden

Ich würde den Wert gerne so laden, wie er ist. Ich habe zwei dimension.xml Dateien, eine in /res/values/dimension.xml und die andere in /res/values-sw360dp/dimension.xml .

Vom Quellcode aus würde ich gerne etwas tun wie

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Das funktioniert, aber der Wert, den ich erhalte, wird mit dem Faktor der Bildschirmdichte multipliziert (1,5 für hdpi, 2,0 für xhdpi, usw.).

Ich habe auch versucht, Folgendes zu tun

getResources().getString(R.dimen.tutorial_cross_marginTop);

Das würde im Prinzip funktionieren, aber ich erhalte eine Zeichenkette, die mit "dip" endet...

14voto

Gibolt Punkte 32347

Eine Kotlin-Erweiterung verwenden

Sie können eine Erweiterung hinzufügen, um diesen Prozess zu vereinfachen. Sie ermöglicht es Ihnen, einfach context.dp(R.dimen. tutorial_cross_marginTop) um den Float-Wert zu erhalten

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

Wenn Sie es ohne Kontext behandeln wollen, können Sie Resources.getSystem() :

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

Verwenden Sie zum Beispiel auf einem xhdpi-Gerät 24.dp um 12,0 zu erhalten oder 12.px 24 zu erhalten

10voto

Nico Punkte 2409

Hier ist eine bessere Lösung, die keine doppelte Umrechnung von dp nach px und dann von px nach dp erfordert:

In Kotlin

fun Resources.getRawDimensionInDp(@DimenRes dimenResId: Int): Float {
    val value = TypedValue()
    getValue(dimenResId, value, true)
    return TypedValue.complexToFloat(value.data)
}
// Usage: 
resources.getRawDimensionInDp(R.dimen.my_dimen_id)

In Java

public class ResourcesUtil {
    static Float getRawDimensionInDp(Resources resources, @DimenRes int dimenResId) {
        TypedValue value = new TypedValue();
        resources.getValue(dimenResId, value, true);
        return TypedValue.complexToFloat(value.data);
    }
}

// Usage: 
ResourcesUtil.getRawDimensionInDp(resources, R.dimen.my_dimen_id);

5voto

AndroidLad Punkte 686

Sie können Integer auch in eine Xml-Datei schreiben.
h http://developer.Android.com/guide/topics/resources/more-resources.html#Integer ? verwenden als.

 context.getResources().getInteger(R.integer.height_pop);

3voto

Dživo Jelić Punkte 1675

Zwei Hilfsfunktionen, die ich dafür in Kotlin geschrieben habe

/**
 * Gets the float value defined in dimens
 * Define float value as following
 * Example:
 * <item name="example" format="float" type="dimen">1.0</item>
 */
fun Resources.getFloatDimension(dimensResourceId: Int): Float {
    val outValue = TypedValue()
    this.getValue(dimensResourceId, outValue, true)
    return outValue.float
}

/**
 * Gets the dp value defined in dimens
 * Example:
 * <dimen name="example">12dp</dimen>
 *
 * Will return 12
 */
fun Resources.getDimensionInDp(dimensResourceId: Int): Int {
    return (getDimension(dimensResourceId) / displayMetrics.density).toInt()
}

2voto

Seven Punkte 137

Wenn Sie nur die Schriftgröße dynamisch ändern wollen, können Sie das tun:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.tutorial_cross_marginTop))

Wie @achie's Antwort, können Sie die dp von dimens.xml wie folgt erhalten:

val dpValue = (resources.getDimension(R.dimen.tutorial_cross_marginTop)/ resources.displayMetrics.density).toInt()

oder erhalten Sie Sp wie dieses

val spValue = (resources.getDimension(R.dimen.font_size)/ resources.displayMetrics.scaledDensity).toInt()

Über Resources.java #{getDimension}

    /**
     * Retrieve a dimensional for a particular resource ID.  Unit 
     * conversions are based on the current {@link DisplayMetrics} associated
     * with the resources.
     * 
     * @param id The desired resource identifier, as generated by the aapt
     *           tool. This integer encodes the package, type, and resource
     *           entry. The value 0 is an invalid identifier.
     * 
     * @return Resource dimension value multiplied by the appropriate 
     * metric.
     * 
     * @throws NotFoundException Throws NotFoundException if the given ID does not exist.
     *
     * @see #getDimensionPixelOffset
     * @see #getDimensionPixelSize
     */

Wert der Ressourcendimension multipliziert mit dem entsprechenden

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