Добавить значение с плавающей запятой в ресурсы и значения Android

Я пытаюсь добавить небольшое пространство между строками в свои TextViews, используя android:lineSpacingMultiplier из документа :

Дополнительный интервал между строками текста, как множитель.

Должно быть значение с плавающей запятой, такое как "1.2".

Как я использую это в нескольких разных текстовых редакторах, я хотел бы добавить глобальные измерения/значения к моим ресурсам, но я не знаю, какой тег использовать, если он существует. Я пробовал все типы ресурсов, которые имеют смысл для меня, но никто из них не работает.

То, что я хотел бы иметь, будет примерно таким:

<resources>
    <dimen name="text_line_spacing">1.4</dimen>
</resources>

Изменить: я знаю android:lineSpacingExtra (которому требуется измерение с добавленным модулем), но я бы хотел использовать android:lineSpacingMultiplier, если это возможно.

Ответ 1

Существует решение:

<resources>
    <item name="text_line_spacing" format="float" type="dimen">1.0</item>
</resources>

Таким образом, ваше число с плавающей точкой будет находиться под @dimen. Обратите внимание, что вы можете использовать другие модификаторы формата и/или типа, где формат обозначает:

Формат = прилагаемый тип данных:

  • поплавок
  • булева
  • фракции
  • целое число
  • ...

и тип означает:

Тип = тип ресурса (ссылка на 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 имеет специальное обращение, а чистый "float" номер не является допустимым размером.


Кроме того, есть небольшой "взломать", чтобы поместить число с плавающей точкой в ​​размер, но WARNED, что это действительно взломать, и вы рискуете потерять диапазон поплавка и точность.

<resources>
    <dimen name="text_line_spacing">2.025px</dimen>
</resources>

и из кода вы можете получить этот float

float lineSpacing = getResources().getDimension(R.dimen.text_line_spacing);

в этом случае значение lineSpacing равно 2.024993896484375, а не 2.025, как вы ожидали.

Ответ 2

Как описано в этой ссылке http://droidista.blogspot.in/2012/04/adding-float-value-to-your-resources.html

Объявить в dimen.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();

Ответ 3

Все решения предлагают использовать предопределенное значение с плавающей точкой через код.

Но в случае, если вам интересно, как ссылаться на предопределенное значение float в 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>

Ответ 4

Я также нашел обходное решение, которое работает нормально, без предупреждений:

<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);

Предупреждение: он работает, только когда вы используете dimen из Java-кода, а не из xml

Ответ 5

Мы также можем использовать его в качестве руководства для макета ограничения.

Создайте файл integer.xml и добавьте в

 <item name="guideline_button_top" type="integer" format="float">0.60</item>

Использовать из файла layout.xml

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

Ответ 6

Я использовал стиль для решения этой проблемы. Официальная ссылка здесь.

Довольно полезный материал. Вы создаете файл для хранения ваших стилей (например, "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."
/>

Попробуйте - это, по сути, то, как весь встроенный пользовательский интерфейс выполняется на андроиде. И используя стили, вы также можете изменять всевозможные другие аспекты ваших представлений.

Ответ 7

Добавьте число с плавающей точкой в 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);

Ответ 8

Если у вас есть простые поплавки, которыми вы управляете диапазоном, вы также можете иметь целое число в ресурсах и делить на число десятичных знаков, которое вам нужно прямо в коде.

Итак, что-то вроде этого

<integer name="strokeWidth">356</integer>

используется с двумя знаками после запятой

this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);    
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);

и это делает его 3.56f

Не сказать, что это самое элегантное решение, но для простых проектов это удобно.

Ответ 9

Я нашел решение, которое работает, но приводит к 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"/>