Тип плавающего/двойного ресурса Android

Как я понял из доступных типов ресурсов Android, нет прямого способа использовать значения float в качестве ресурсов, если вы не используете некоторые хаки, такие как упомянутый в здесь. Есть ли какое-нибудь соглашение или что-то в этом роде?

Ответ 1

Нет, для float/double нет прямого типа ресурсов.

Но да, есть два взлома.

1) В dimens.xml

<item name="float" type="dimen" format="float">9.52</item>

Ссылка на java

TypedValue typedValue = new TypedValue();
getResources().getValue(R.dimen.my_float_value, typedValue, true);
float myFloatValue = typedValue.getFloat();

И во-вторых, как предложил Боян и Хареш, использовать значение как строку и проанализировать его в вашем коде в runTime.

Ответ 2

Просто сохраните свой двойник в качестве ресурса String

<string name="some_decimal">0.12154646</string>

И затем просто проанализируйте, что в вашем коде, как этот

double some_decimal = Double.parseDouble(context.getString(R.string.some_decimal));

Вы также можете сделать свой собственный тип значений ресурсов и получить его оттуда, как это

<item name="some_decimal" type="vals" format="float">2.0</item>

И затем сделайте это так

TypedValue tempVal = new TypedValue();
getResources().getValue(R.vals.some_decimal, tempVal, true);
float some_decimal = tempVal.getFloat();

Но невозможно получить такие двойники, и я думаю, что он менее эффективен, чем просто разбирает строковый ресурс, поэтому я предпочитаю свой первый вариант.

Ответ 3

Добавьте число с плавающей точкой в sizess.xml:

<item format="float" name="my_dimen" type="dimen">0.54</item>

Для ссылки из XML:

<ImageView 
    android:alpha="@dimen/my_dimen"
    ...

Чтобы прочитать это значение программно, вы можете использовать ResourcesCompat.getFloat из androidx.core

Зависимость Gradle:

implementation("androidx.core:core:${version}")

Использование:

import androidx.core.content.res.ResourcesCompat;

...

float value = ResourcesCompat.getFloat(context.getResources(), R.dimen.my_dimen);