Додайте значення плаваючої точки до ресурсів / значень для Android


243

Я намагаюся додати трохи простору між рядками в моїй TextViews , використовуючи android:lineSpacingMultiplier з документації :

Додатковий інтервал між рядками тексту, як множник.

Повинно бути значенням з плаваючою комою, наприклад, "1,2".

Оскільки я використовую це в кількох різних TextViews, я хотів би додати до своїх ресурсів глобальний вимір / значення, але я не знаю, який тег використовувати, якщо він навіть існує. Я спробував усі типи ресурсів, які мають для мене сенс, але жоден з них не працює.

Я хотів би мати щось подібне:

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

Редагувати: мені відомо android:lineSpacingExtra(якому потрібен розмір із доданою одиницею), але я хотів би використовувати, android:lineSpacingMultiplierякщо можливо.

Відповіді:


517

Є рішення:

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

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

Формат = додавання типу даних:

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

і тип стенди для:

Тип = тип ресурсу (з посиланням на R.XXXXX.name):

  • колір
  • гам
  • рядок
  • стиль
  • тощо ...

Щоб отримати ресурс з коду, слід використовувати цей фрагмент:

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як ви очікували.


2
Я спробував використовувати це, але отримати NotFoundException, "тип # 0x04 недійсний", при отриманні значення з коду.
Мойсей Хіменес

Ви можете бути більш конкретними щодо проблеми? ви, ймовірно, використовували неправильний тип даних для формату ...
Томо

19
@rodkarom для отримання floats з xml, використовуйте цей XML: <item type="string" format="float" name="my_float">0.5</item>і цей код, щоб отримати його:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
gregn3

1
@ gregn3 Чи не можна це зробити просто з <string>тегом?
pablisco

4
Я думаю, вам слід зняти хакітську частину, забруднення просто ідеально, як є.
Mathijs Segers

83

Як описано в цьому посиланні 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();

43

Усі рішення пропонують використовувати заздалегідь задане значення float через код.

Але якщо вам цікаво, як посилатися на заздалегідь задане значення 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>

1
Це найкраща відповідь, оскільки вона дозволяє мені змінювати значення динамічного розміру при обертанні екрана без необхідності писати код.
Філео99

@Vyacheslav для чорнових предметів, ви повинні використовувати стандартні розміри
waqaslam

він взагалі не працює. AndroidStudio виходить з ладу навіть з розмірами
В’ячеслав

Я мав на увазі використання<dimen>
waqaslam

19

Я також знайшов рішення, яке, здається, працює нормально без попереджень:

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

Попередження : він працює лише тоді, коли ви використовуєте dim з коду Java, а не з xml


Це, на жаль, не працює, якщо я використовую таке значення у визначенні XML: android: lineSpacingMultiplier = "@ dimen / TEXT_SPACING_MULTIPLIER". Це викликає NumberFormatException при надуванні макета.
peter.bartos

4
Саме так. Він працює лише тоді, коли використовується розмір з коду Java.
Крістіан

2
Це найкращий спосіб отримати доступ до плаваючих файлів з коду.
Алекс Локвуд

У floats.xml я додав <item name = "shadow_percent" type = "dimen"> 25% </item>, а потім у своєму малюванні я використав цей відсоток, щоб встановити центр градієнта тіні за допомогою android: centerY = "@ dimen / shadow_percent ". Це чудово спрацювало, щоб встановити тінь на 25% від загальної висоти списку шарів. СПАСИБІ!
Chris Sprague

лише примітка, яку ви повинні використовувати, type="fraction"щоб уникнути помилок у коді Java
adek111

8

Додайте поплавок до dimens.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);

7

Ми також можемо використовувати його для орієнтації макета обмеження.

Створіть файл integer.xml та додайте його

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

Використовуйте з файлу layout.xml

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

1
саме те, що мені потрібно, я використовую це для різних відсоткових значень для планшетів і різних для мобільних пристроїв, не створюючи два файли макета
abdu

5

Я використовував стиль для вирішення цього питання. Офіційне посилання тут .

Досить корисні речі. Ви створюєте файл для зберігання своїх стилів (наприклад, "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."
/>

Спробуйте - це, по суті, як весь вбудований інтерфейс зроблений на андроїд. І, використовуючи стилі, у вас є можливість змінювати всілякі інші аспекти ваших переглядів.


2

Якщо у вас є прості плавці, якими ви керуєте діапазон, ви також можете мати ціле число в ресурсах і ділити на кількість знаків після коми, які вам потрібні прямо в коді.

Так щось подібне

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

вживається з 2 знаками після коми

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

і це робить його 3.56f

Не кажучи, що це найелегантніше рішення, але для простих проектів це зручно.


0

Я знайшов рішення, яке працює, але призводить до 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"/>

дивіться мою відповідь вище. ви можете використовувати "загальний" ресурсний елемент, де слід вказати формат і тип. формат призначений для типу java (float, boolean, дроб, integer тощо), а тип - для посилання на ресурси для android gen ("dimen" для R.dimen, "color" для R.color, "string" для R.string та ін.)
Томо

Це була моя перша відповідь, яка зараз справді застаріла, тому я прийняв вашу відповідь. :)
слуп

0

Хоча раніше я використовував прийняту відповідь, схоже, що з поточними інструментами побудови можливо зробити:

   <dimen name="listAvatarWidthPercent">0.19</dimen>

Я використовую програму Build Tools основної версії 29.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.