安卓:如何通过编程设置XML dimen变量

9

在我的布局XML文件中,我通过一个名为dimens.xml的单独文件引用了许多参数。

例如,dimens.xml包含这些参数:

<dimen name="textSize_normal">20dp</dimen>
<dimen name="buttonTextSize_normal">15dp</dimen>
<dimen name="editTextSize_normal">17dp</dimen>
<dimen name="buttonHeight_normal">37dp</dimen>
<dimen name="margin_normal">5dp</dimen>

比如,在我的main.xml中,我可以通过以下方式设置TextView的文本大小:

android:textSize="@dimen/editTextSize_normal"

它的功能非常好。

现在,我的问题是,是否可以从我的主要活动程序动态地设置dimen.xml文件中的dimen变量的值? 我正在尝试获取屏幕大小,并根据屏幕高度的一部分设置例如textSize的值,以便它可以轻松适应任何屏幕大小。我已经想好了所有这些,我只需要你的帮助来弄清楚如何在我的代码中设置dimen变量。


3
文本大小通常以比例像素 (sp) 设置,因此其根据设备的默认字体大小进行调整。该默认字体大小基于制造商设置和(在 ICS 及更高版本中)用户重写。如果使用 sp,则文本大小应自动适应屏幕大小和用户偏好,无需您进行某种屏幕大小百分比计算。 - CommonsWare
@CommonsWare 好的,没问题,但我想将这个应用到其他方面。比如图片尺寸。 - capcom
4个回答

12
现在我的问题是,是否可能从我的主活动以编程方式在dimen.xml文件中设置dimen变量的值?
不可能。
我所尝试的是获取屏幕大小,并根据屏幕高度的一部分设置例如textSize,以便它可以轻松适应任何屏幕大小。
忽略这是一种奇怪的UI方法,做法是删除你的 android:textSize 属性,并在Java中使用 setTextSize() 在运行时更改文本大小。
我已经想好了所有这些,我只需要你的帮助来弄清楚如何在我的代码中设置dimen变量。
你不能“设置dimen变量”。你通过像setTextSize()这样的setter将计算应用于小部件。

我知道这是一种奇怪的用户界面设计方法,但我还能做什么呢?你看,我的问题是我为小型、普通、大型和超大型屏幕尺寸创建了布局。我遇到的问题是,如果我在普通布局中创建一个EditText字段,并将其高度设置为50dp。它在3.2英寸屏幕上看起来正常,但在4英寸屏幕上相对于屏幕尺寸来说显得太小(这也符合普通布局文件)。除了使用屏幕尺寸的百分比之外,我如何解决这个问题?谢谢,非常感谢你的回答。 - capcom
@capcom:“我知道这是一种奇怪的UI方法,但我还能做什么呢?”--使用适当的属性设置EditText的高度,以显示特定行数的文本,而不是硬编码高度值。然后你就可以放心了,不必担心在3.2英寸到4.0英寸屏幕上外观差异的问题。 - CommonsWare

7

不能在运行时编辑资源文件,因为它们已经被编译和生成。


1
你确定吗?我能够覆盖XML布局文件中的其他内容。例如,我可以在运行时非常容易地改变ImageViews的图像大小,而不管我最初在XML文件中设置的是什么。 - capcom
1
@capcom:“你确定吗?”——我非常确定您无法在运行时修改尺寸资源或任何其他类型的资源。“我可以很容易地在运行时更改ImageViews的图像大小,而不管我最初在XML文件中设置它们为什么”——那是Java。Java!=资源。资源在运行时是只读的。 - CommonsWare
3
您无法更改资源,但您可以在Java代码中设置任何内容,例如宽度或高度-因此可以逻辑上覆盖它们。 - Yar

1

在所有资源中,您应该使用密度无关像素,以便尺寸可以适应屏幕大小。您不需要在运行时计算这些值。如果您想要为不同的屏幕尺寸使用不同的布局,则考虑使用多个资源文件。

阅读本指南


我已经设置了四个布局,但问题是即使在特定的布局中也有不同的屏幕尺寸。例如,在“正常”大小的布局中,3.2英寸和4.3英寸的屏幕都可以使用。它们的“dp”数量也不同,因此如果我为3.2英寸设计应用程序,则无法填满整个屏幕。 - capcom
@capcom:通常情况下,你可以通过布局规则(例如LinearLayout的android:layout_weight)来处理这个问题,而不是手动计算像素数。 - CommonsWare

1
我猜你的意思是根据设备屏幕大小来改变尺寸。可以通过在像values-hdpi、values-xhdpi、values-xxhdpi、values-mdpi这样的文件夹中创建多个dimens.xml文件来实现,然后在运行时编译器将根据dpi选择dimen。我以前没有尝试过,但我读到了这篇文章。请看这个链接:http://developer.android.com/guide/practices/screens_support.html#qualifiers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接