ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试使用 documentation 中的 android:lineSpacingMultiplier 在我的 TextViews 的行之间添加一点空间:

文本行之间的额外间距,作为乘数。必须是浮点值,例如“1.2”。

当我在几个不同的 TextViews 中使用它时,我想为我的资源添加一个全局维度/值,但我不知道要使用哪个标签,如果它甚至存在的话。我已经尝试了所有对我有意义的 resource types,但它们都不起作用。

我想要的是这样的:

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

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


T
Tomo

有一个解决方案:

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

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

格式 = 封闭数据类型:

漂浮

布尔值

分数

整数

...

type 代表:

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

颜色

点门

细绳

风格

ETC...

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

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


我尝试使用它,但在从代码中检索值时得到 NotFoundException,“类型 #0x04 无效”。
你能更具体地说明问题吗?您可能使用了错误的数据类型来格式化...
@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 不能简单地使用 <string> 标签来完成吗?
我认为您应该删除骇人听闻的部分,解决方案就是完美的。
y
yajnesh

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

w
waqaslam

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

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

这是最好的答案,因为它使我能够在屏幕旋转时动态更改尺寸值,而无需编写代码。
@Vyacheslav 对于可绘制对象,您应该使用标准尺寸
它根本不起作用。即使有尺寸,AndroidStudio 也会失败
我的意思是使用 <dimen>
如果我们必须以编程方式引用这些值怎么办?
A
Alex Baker

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

R
Raymond Chenon

我还找到了一种解决方法,它似乎可以正常工作而没有警告:

<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 时,它才有效


不幸的是,如果我在 XML 定义中使用这样的值,这不起作用:android:lineSpacingMultiplier="@dimen/TEXT_SPACING_MULTIPLIER"。它在膨胀布局时会导致 NumberFormatException。
确切地。它仅在您使用 Java 代码中的维度时才有效。
这是我能找到的从代码中访问浮点数的最佳方式。
在 floats.xml 我添加了 25% 然后在我的drawable中我使用这个百分比来设置阴影渐变的中心,使用 android:centerY="@dimen/shadow_percent ”。这可以完美地将阴影设置为图层列表总高度的 25%。谢谢你!
请注意,您应该使用 type="fraction" 来避免 Java 代码中的错误
P
Photon Point

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

创建 integer.xml 文件并添加到

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

从 layout.xml 文件中使用

 app:layout_constraintGuide_percent="@integer/guideline_button_top" 

正是我需要的,我将其用于平板电脑的不同百分比值和移动设备的不同百分比值,而无需创建两个布局文件
S
SMBiggs

我用一种风格来解决这个问题。官方链接是 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."
/>

试试看——这基本上就是所有内置 UI 在 android 上的完成方式。通过使用样式,您还可以选择修改视图的各种其他方面。


T
Thanasis Kapelonis

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

所以像这样

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

与小数点后 2 位一起使用

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

这使它成为3.56f

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


J
JJD

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

见我上面的回答。您可以使用“通用”资源项,您应该在其中指定格式和类型。 format 用于 java 类型(float、boolean、fraction、integer 等),type 用于 android gen 资源引用(“dimen”用于 R.dimen,“color”用于 R.color,“string”用于 R.string , ETC。)
这是我最初的答案,现在已经过时了,这就是我接受你的答案的原因。 :)
a
androidguy

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

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

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


S
Spirit of the Void

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

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

然后得到:

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

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


T
Trake Vital

如果当您只允许提供特定类型的 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>