为android资源/值添加浮点值

我试图添加一行之间的小空间到我的TextViews使用android:lineSpacingMultiplier文档:

文本行之间的额外间距, 作为乘数。< / p >

必须为浮点值,例如 “1.2”< / p >。

因为我在几个不同的TextViews中使用这个,我想添加一个全局维度/值到我的资源,但我不知道要使用哪个标签,如果它甚至存在。 我已经尝试了所有对我有意义的资源类型,但没有一个是有效的

我想要的是这样的:

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

编辑:我知道android:lineSpacingExtra(需要一个附加单位的维度),但如果可能的话,我想使用android:lineSpacingMultiplier

114705 次浏览

我找到了一个解决方案,它的工作,但在LogCat中确实会导致Warning (WARN/Resources(268): Converting to float: TypedValue{t=0x3/d=0x4d "1.2" a=2 r=0x7f06000a})。

<resources>
<string name="text_line_spacing">1.2</string>
</resources>


<android:lineSpacingMultiplier="@string/text_line_spacing"/>

我还发现了一个没有警告的变通方法:

<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代码中使用dimen而不是从xml中使用dimen时有效

我使用了一种风格来解决这个问题。官方链接是在这里

非常有用的东西。您可以创建一个文件来保存样式(如“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上所有内置UI的运作方式。通过使用样式,你也可以选择修改视图的所有其他方面。

有一个解决方案:

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

通过这种方式,您的浮点数将在@dimen下面。注意,你可以使用其他“format”和/或“type”修饰符,其中format代表:

Format =封闭数据类型:

  • 浮动
  • 布尔
  • 分数
  • 整数
  • ...

type代表:

Type =资源类型(使用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有特殊处理,纯“浮动”数字不是有效的维度。


此外,还有一个小的“hack”来将浮点数放入维度,但这是警告,这是真正的黑客,你有可能失去浮点范围和精度。

<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所述

在dimension .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>

如果您有控制范围的简单浮点数,您也可以在资源中使用一个整数,并在代码中直接除以所需的小数点后数位。

就像这样

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

小数点后2位

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

这使得它3.56度

并不是说这是最优雅的解决方案,但对于简单的项目来说,它很方便。

我们也可以用它作为约束布局的指导原则。

创建integer.xml文件并添加到

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

从layout.xml文件中使用

 app:layout_constraintGuide_percent="@integer/guideline_button_top"

在dimensions .xml中添加一个浮点数:

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

从XML引用:

<EditText
android:lineSpacingMultiplier="@dimen/my_dimen"
...

要以编程方式读取这个值,可以使用androidx.core中的ResourcesCompat.getFloat

Gradle依赖性:

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

用法:

import androidx.core.content.res.ResourcesCompat;


...


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

虽然我在过去使用了公认的答案,但似乎使用当前的构建工具可以做到:

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

我使用的是Build Tools主要版本29。

float或double形参可以存储为字符串:

<resources>
<string name="x">0.01</string>
</resources>

然后得到:

double value = Double.parseDouble(this.getString(R.string.x));

如果你想把x解析为浮点数,请使用java.lang.Float.parseFloat()。

如果有人对“欺骗系统”感兴趣;当你被允许只给出特定类型的XML值时,特别是在android布局格式中使用嵌入权重的XML值时,你可以这样做:

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