8

而不是为每个文本视图使用以下行:

android:textSize="40sp"

我可以用变量替换 40sp 吗?

作为一个附带问题,我被建议使用 SP 单位,因为它是由用户定义的设置决定的。这是最佳做法吗?

4

3 回答 3

9

我可以用变量替换 40sp 吗?

您可以使用维度资源(例如android:textSize="@dimen/someSize"),也可以使用执行此操作的样式(根据 AlexN 的回答),或者在运行时通过setTextSize().

我被推荐使用 SP 单位,因为它是由用户定义的设置决定的。这是最佳做法吗?

在较新版本的 Android 上,用户可以通过设置应用程序更改基本字体大小。通过使用spfor 单位,您的字体大小将与基本字体大小一起缩放。如果您使用其他单位(例如,dp),则无论用户在“设置”中使用什么字体,您的字体大小都将保持不变。不可能说任何给定的使用是否sp是“最佳实践”——我确信在某些情况下允许更改字体大小将是一件坏事。但是,默认情况下,这sp可能是正确的起点。

于 2012-09-02T14:08:09.047 回答
3

据我所知,使用 SP 对于文本大小来说是一个非常好的做法。根据您的第一个问题-我认为我们不能使用变量,但是,有更好的方法。看看 - http://developer.android.com/guide/topics/ui/themes.html

因此,如果您要定义一种样式,您可以像这样在 XML 中声明您的视图,<TextView android:id = "@+id/myId" style = "@style/myStyle"/> 并且这种样式将封装您想要设置到该屏幕上的 textViews 的所有参数。

于 2012-09-02T14:05:08.033 回答
2

不,不可能在 XML 文件中使用基于代码的变量。但是,您可以为此使用样式。

例子:

<style name="MyTvStyle">
  <item name="android:textSize">40sp</item>
</style>

然后像这样应用它:

<TextView style="@style/MyTvStyle" ... />

A code based approach is also possible. If the TextViews have their android:id attribute defined you can retrieve them in the code with the findViewById method.

Example:

int[] id_array = {
    R.id.textview1, R.id.textview2, R.id.textview3 //Put all the id's of your textviews here
}

for(int i : id_array) { //Loop trough all the id's and retrieve the Textview associated with it.
    TextView textview = (TextView)findViewById(i);
    tv.setTextSize(TypedValue.COMPLEX_UNIT_SP,40); //Set the text size to 40sp
}

And yes it's always better to use sp instead of normal pixel values. Since sp will scale with device size and user settings.

于 2012-09-02T14:08:40.633 回答