Добавить значение с плавающей запятой в ресурсы / значения Android
Я пытаюсь добавить немного пространства между строками в мои TextViews, используя android:lineSpacingMultiplier
из документации:
Дополнительный интервал между строками текста, как множитель.
Должно быть значением с плавающей запятой, например, "1.2".
Поскольку я использую это в нескольких различных TextViews, я хотел бы добавить глобальное измерение / значение к моим ресурсам, но я не знаю, какой тег использовать, если он вообще существует. Я перепробовал все типы ресурсов, которые имеют смысл для меня, но ни один из них не работает.
То, что я хотел бы иметь, было бы что-то вроде этого:
<resources>
<dimen name="text_line_spacing">1.4</dimen>
</resources>
Изменить: я в курсе android:lineSpacingExtra
(которому нужно измерение с добавленной единицей), но я бы хотел использовать android:lineSpacingMultiplier
если возможно.
13 ответов
Есть решение:
<resources>
<item name="text_line_spacing" format="float" type="dimen">1.0</item>
</resources>
Таким образом, ваш номер с плавающей точкой будет находиться под @dimen. Обратите внимание, что вы можете использовать другие модификаторы "format" и / или "type", где format означает:
Формат = вмещающий тип данных:
- поплавок
- логический
- доля
- целое число
- ...
и тип означает:
Тип = тип ресурса (упоминается как R.XXXXX.name):
- цвет
- DIMEN
- строка
- стиль
- так далее...
Чтобы получить ресурс из кода, вы должны использовать этот фрагмент:
TypedValue outValue = new TypedValue();
getResources().getValue(R.dimen.text_line_spacing, outValue, true);
float value = outValue.getFloat();
Я знаю, что это сбивает с толку (вы ожидаете, что звонок как getResources().getDimension(R.dimen.text_line_spacing)
), но Android dimensions
иметь специальную обработку и чистое число с плавающей точкой не является допустимым размером.
Кроме того, существует небольшой "взлом", чтобы поместить число с плавающей точкой в размерность, но имейте в виду, что это действительно взлом, и вы рискуете потерять диапазон и точность с плавающей точкой.
<resources>
<dimen name="text_line_spacing">2.025px</dimen>
</resources>
и из кода, вы можете получить этот плавающий по
float lineSpacing = getResources().getDimension(R.dimen.text_line_spacing);
в этом случае значение lineSpacing
является 2.024993896484375
, и не 2.025
как ты и ожидал.
Как описано в этой ссылке http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html
Объявить в измерении.xml
<item name="my_float_value" type="dimen" format="float">9.52</item>
Ссылка из XML
@dimen/my_float_value
Ссылка из Java
TypedValue typedValue = new TypedValue();
getResources().getValue(R.dimen.my_float_value, typedValue, true);
float myFloatValue = typedValue.getFloat();
Все решения предлагают вам использовать предопределенное значение с плавающей запятой через код.
Но если вам интересно, как ссылаться на предопределенное значение с плавающей точкой в XML (например, макеты), то ниже приведен пример того, что я сделал, и он работает отлично:
Определите значения ресурсов как type="integer"
но format="float"
, например:
<item name="windowWeightSum" type="integer" format="float">6.0</item>
<item name="windowNavPaneSum" type="integer" format="float">1.5</item>
<item name="windowContentPaneSum" type="integer" format="float">4.5</item>
А потом используйте их в макете, используя @integer/name_of_resource
, например:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="@integer/windowWeightSum" // float 6.0
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="@integer/windowNavPaneSum" // float 1.5
android:orientation="vertical">
<!-- other views -->
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="@integer/windowContentPaneSum" // float 4.5
android:orientation="vertical">
<!-- other views -->
</LinearLayout>
</LinearLayout>
Добавьте число с плавающей точкой в sizess.xml:
<item format="float" name="my_dimen" type="dimen">1.2</item>
Для ссылки из XML:
<EditText
android:lineSpacingMultiplier="@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);
Я также нашел обходной путь, который, кажется, работает нормально без предупреждений:
<resources>
<item name="the_name" type="dimen">255%</item>
<item name="another_name" type="dimen">15%</item>
</resources>
Затем:
// theName = 2.55f
float theName = getResources().getFraction(R.dimen.the_name, 1, 1);
// anotherName = 0.15f
float anotherName = getResources().getFraction(R.dimen.another_name, 1, 1);
Предупреждение: это работает только тогда, когда вы используете измерение из кода Java, а не из XML
Мы также можем использовать его в качестве руководства для макета ограничения.
Создать файл integer.xml и добавить в
<item name="guideline_button_top" type="integer" format="float">0.60</item>
Использовать из файла layout.xml
app:layout_constraintGuide_percent="@integer/guideline_button_top"
Я использовал стиль, чтобы решить эту проблему. Официальная ссылка здесь.
Довольно полезный материал. Вы создаете файл для хранения ваших стилей (например, "styles.xml") и определяете их внутри него. Затем вы ссылаетесь на стили в вашем макете (например, "main.xml").
Вот пример стиля, который делает то, что вы хотите:
<style name="text_line_spacing">
<item name="android:lineSpacingMultiplier">1.4</item>
</style>
Допустим, вы хотите изменить простое TextView с этим. В вашем файле макета вы наберете:
<TextView
style="@style/summary_text"
...
android:text="This sentence has 1.4 times more spacing than normal."
/>
Попробуйте - это, по сути, как все встроенный пользовательский интерфейс делается на Android. А с помощью стилей у вас есть возможность изменить все виды других аспектов ваших просмотров.
Если кто-то заинтересован в «обмане системы», когда вам разрешено указывать только определенные типы значений xml, особенно при использовании значений xml для встроенных весов в форматировании макета Android, вы можете сделать что-то вроде этого:
<item name="actvity_top_panel_weight" format="float" type="integer">1.5</item>
Указанное выше значение xml действует как число с плавающей запятой, но называется целым числом.
Тогда вы можете без проблем использовать это как следующее:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="@integer/actvity_top_panel_weight"
android:orientation="horizontal"></LinearLayout>
Если у вас есть простые числа с плавающей точкой, которыми вы управляете, вы также можете иметь целое число в ресурсах и делить его на количество десятичных разрядов, которое вам нужно прямо в коде.
Так как то так
<integer name="strokeWidth">356</integer>
используется с 2 знаками после запятой
this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);
и это делает 3.56f
Не сказать, что это самое элегантное решение, но для простых проектов это удобно.
Параметр float или double можно сохранить в виде строки:
<resources>
<string name="x">0.01</string>
</resources>
а затем получается как:
double value = Double.parseDouble(this.getString(R.string.x));
Используйте java.lang.Float.parseFloat(), если вы хотите, чтобы x был преобразован в число с плавающей запятой.
Хотя я использовал принятый ответ в прошлом, кажется, что с текущими инструментами сборки это возможно:
<dimen name="listAvatarWidthPercent">0.19</dimen>
Я использую основную версию Build Tools 29.
Я нашел решение, которое работает, но приводит к Warning
(WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a}
) в LogCat.
<resources>
<string name="text_line_spacing">1.2</string>
</resources>
<android:lineSpacingMultiplier="@string/text_line_spacing"/>
Поправь меня:
<resources>
<dimen name="text_line_spacing">2.025px</dimen>
</resources>