将浮点值添加到android资源/值


243

我试图线使用我的TextViews之间添加一点空间android:lineSpacingMultiplier文档

文本行之间的额外间距,作为乘数。

必须为浮点值,例如“ 1.2”。

当我在几个不同的TextViews中使用此标记时,我想向资源中添加一个全局维度/值,但是我不知道要使用哪个标记(即使它存在)。我尝试了所有对我有意义的资源类型,但是它们都不起作用。

我想要的是这样的:

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

编辑:我知道android:lineSpacingExtra(它需要一个带有附加单位的尺寸),但是android:lineSpacingMultiplier如果可能的话,我想使用。

Answers:


517

有一个解决方案:

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

这样,您的浮点数将位于@dimen下。请注意,您可以使用其他“格式”和/或“类型”修饰符,其中format表示:

格式=包含的数据类型:

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

和type代表:

类型=资源类型(用R.XXXXX.name引用):

  • 颜色
  • men门
  • 样式
  • 等等...

要从代码中获取资源,您应该使用以下代码段:

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”将浮点数放入维中,但是要警告确实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因为你的预期。


2
我尝试使用此方法,但是从代码中检索值时得到NotFoundException,“类型#0x04无效”。
Moises Jimenez 2012年

您能更具体地解决问题吗?您可能使用了错误的数据类型来格式化...
Tomo,2012年

19
@rodkarom以从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 2012年

1
@ gregn3不能简单地通过<string>标签来完成吗?
pablisco,2014年

4
我认为您应该删除hackhack的部分,该解决方案非常完美。
Mathijs Segers


43

所有解决方案都建议您通过代码使用预定义的float值。

但是,如果您想知道如何在XML中引用预定义的float值(例如布局),那么以下是我所做的示例,它运行良好:

将资源值定义为type="integer"but 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
这是最好的答案,因为它使我可以在屏幕旋转时动态更改尺寸值,而无需编写代码。
Phileo99,2013年

@Vyacheslav用于可绘制对象,您应该使用标准尺寸
waqaslam

它根本不起作用。AndroidStudio甚至因尺寸问题而失败
Vyacheslav

我的意思是使用<dimen>
waqaslam,2013年

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

警告:仅当您使用Java代码中的dimen而不是xml中的dimen时才有效


如果我在XML定义中使用以下值,则这将无法正常工作:android:lineSpacingMultiplier =“ @ dimen / TEXT_SPACING_MULTIPLIER”。膨胀布局时会导致NumberFormatException。
peter.bartos 2011年

4
究竟。仅当您使用Java代码中的dimen时才有效。
克里斯蒂安(Cristian)

2
这是我从代码访问浮点数的最佳方法。
Alex Lockwood

在floats.xml中,我添加了<item name =“ shadow_percent” type =“ dimen”> 25%</ item>,然后在我的可绘制对象中,使用android:centerY =“ @ dimen / shadow_percent这个百分比来设置阴影渐变的中心”。这可以完美地将阴影设置为图层列表总高度的25%。谢谢!
克里斯·斯普拉格

只是注意,您应该使用type="fraction"以避免Java代码中的错误
adek111 '18

8

将浮点数添加到dimens.xml:

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

要从XML引用:

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

要以编程方式读取此值,可以使用ResourcesCompat.getFloatandroidx.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 18'Jul

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."
/>

尝试一下-本质上这就是在android上完成所有内置UI的方式。通过使用样式,您还可以选择修改视图的所有其他方面。


2

如果您具有控制范围的简单浮点数,则资源中也可以有一个整数,然后除以代码中需要的小数位数。

所以像这样

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

用于小数点后2位

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

就是3.56f

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


0

我找到了一个可行的解决方案,但在LogCat中确实导致了WarningWARN/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"/>

请参阅上面的答案。您可以使用“通用”资源项,在其中应指定格式和类型。格式适用于Java类型(浮点数,布尔值,分数,整数等),类型适用于android gen gen资源参考(“ dimen”代表R.dimen,“ color”代表R.color,“ string”代表R.string等等)
Tomo 2012年

这是我最初的答案,现在真的过时了,这就是为什么我接受您的答案。:)
slup 2012年

0

尽管我过去使用的是公认的答案,但是使用当前的构建工具似乎可以做到:

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

我正在使用Build Tools主版本29。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.