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

我试图从文档中使用android:lineSpacingMultiplier在我的TextViews之间添加一些空格。

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

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

正如我在几个不同的TextView中使用这个,我想添加一个全局维/值到我的资源,但我不知道哪个标签,如果它甚至存在。 我已经尝试了所有对我有意义的资源types ,但没有一个可行。

我想要的是这样的:

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

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

有一个解决scheme:

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

这样,你的浮点数将在@dimen下。 请注意,您可以使用其他“格式”和/或“types”修饰符,格式代表:

格式=封闭数据types:

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

和types代表:

Type =资源types(用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

如链接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(); 

所有的解决scheme都build议您通过代码使用预定义的浮点值。

但是,如果您想知道如何引用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 layout @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> 

我也发现了一个解决方法似乎没有任何警告正常工作:

 <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的维时,它才起作用

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

相当有用的东西。 你创build一个文件来保存你的样式(比如“styles.xml”),并在里面定义它们。 然后,您可以引用布局中的样式(如“main.xml”)。

下面是一个你想要的示例样式:

 <style name="text_line_spacing"> <item name="android:lineSpacingMultiplier">1.4</item> </style> 

假设你想用这个改变一个简单的TextView。 在你的布局文件中你可以input:

 <TextView style="@style/summary_text" ... android:text="This sentence has 1.4 times more spacing than normal." /> 

尝试一下 – 这基本上是所有的内置用户界面在Android上完成的。 通过使用样式,您还可以select修改视图的各种其他方面。

我发现了一个解决scheme,但是在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"/> 

如果你有简单的浮点数来控制范围,你也可以在资源中使用一个整数,然后除以你需要直接input的小数位数。

所以像这样的东西

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

用于2位小数

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

这使得3.56f

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