我正在尝试使用 documentation 中的 android:lineSpacingMultiplier
在我的 TextViews 的行之间添加一点空间:
文本行之间的额外间距,作为乘数。必须是浮点值,例如“1.2”。
当我在几个不同的 TextViews 中使用它时,我想为我的资源添加一个全局维度/值,但我不知道要使用哪个标签,如果它甚至存在的话。我已经尝试了所有对我有意义的 resource types,但它们都不起作用。
我想要的是这样的:
<resources>
<dimen name="text_line_spacing">1.4</dimen>
</resources>
编辑:我知道 android:lineSpacingExtra
(它需要一个带有附加单位的维度),但如果可能的话,我想使用 android:lineSpacingMultiplier
。
有一个解决方案:
<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
。
如此链接 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();
所有解决方案都建议您通过代码使用预定义的浮点值。
但是,如果您想知道如何在 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>
<dimen>
向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);
我还找到了一种解决方法,它似乎可以正常工作而没有警告:
<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 时,它才有效
type="fraction"
来避免 Java 代码中的错误
我们也可以将它用作约束布局的指南。
创建 integer.xml 文件并添加到
<item name="guideline_button_top" type="integer" format="float">0.60</item>
从 layout.xml 文件中使用
app:layout_constraintGuide_percent="@integer/guideline_button_top"
我用一种风格来解决这个问题。官方链接是 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 上的完成方式。通过使用样式,您还可以选择修改视图的各种其他方面。
如果您有控制范围的简单浮点数,您还可以在资源中有一个整数,然后除以代码中需要的小数位数。
所以像这样
<integer name="strokeWidth">356</integer>
与小数点后 2 位一起使用
this.strokeWidthFromResources = resources_.getInteger(R.integer.strokeWidth);
circleOptions.strokeWidth((float) strokeWidthFromResources/ 100);
这使它成为3.56f
并不是说这是最优雅的解决方案,但对于简单的项目来说,它很方便。
我找到了一个可行的解决方案,但确实会在 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"/>
尽管我过去使用了公认的答案,但似乎使用当前的构建工具可以做到:
<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>
<item type="string" format="float" name="my_float">0.5</item>
和这个代码来检索它:float my_float = Float.parseFloat (getResources ().getString (R.string.my_float));
<string>
标签来完成吗?