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

时间:2010-07-19 15:20:00

标签: android resources floating-point

我正在尝试使用android:lineSpacingMultiplier在文本视图之间添加一些空格 来自documentation

  

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

     

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

由于我在几个不同的TextView中使用它,我想为我的资源添加一个全局维度/值,但我不知道使用哪个标记,如果它甚至存在。 我已经尝试了对我有意义的所有resource types,但它们都没有用。

我想拥有的是这样的:

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

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

11 个答案:

答案 0 :(得分:473)

有一个解决方案:

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

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

格式=封闭数据类型:

  • 布尔
  • 分数
  • 整数
  • ...

和类型代表:

Type =资源类型(以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

答案 1 :(得分:74)

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

答案 2 :(得分:35)

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

但是如果您想知道如何在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>

答案 3 :(得分:17)

我还找到了一种似乎没有任何警告的解决方法:

<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

时才有效

答案 4 :(得分:6)

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

创建integer.xml文件并添加到

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

使用layout.xml文件

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

答案 5 :(得分:5)

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

非常有用的东西。您创建一个文件来保存样式(如“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。通过使用样式,您还可以选择修改视图的各种其他方面。

答案 6 :(得分:2)

如果您有控制范围的简单浮点数,您还可以在资源中使用整数除以代码中需要的小数位数。

这样的事情

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

用于2位小数

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

这使得 3.56f

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

答案 7 :(得分: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"/>

答案 8 :(得分:0)

将浮点数添加到dimens.xml:

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

要从XML引用:

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

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

等级依赖性:

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

用法:

import androidx.core.content.res.ResourcesCompat;

...

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

答案 9 :(得分:0)

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

req=new XMLHttpRequest();
req.open('POST','submit.php');                                                                req.setRequestHeader('Content-type','application/json;  charset=UTF-8');
req.onload=function(resp){
    if (resp.target.status==200){
          do something....
    }
}

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

答案 10 :(得分:0)

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

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

然后获得为:

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

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