安卓远程视图自定义字体

6
我该如何在我的小部件中设置自定义字体?
remoteViews.setTextViewText(R.id.text1,""+ days);

可以有人给我展示一下如何设置这个字体的示例吗?

看一下这个网址 custom-font-on-a-android-widget - Talha
3个回答

11
我怎样才能在我的小部件中使用自定义字体?
你不能。你可以通过在布局XML中使用 android:typeface 来选择三种内置字体之一,但是你不能在 RemoteViews 中的 TextView 上使用自定义字体。Java方法 setTypeface() 用于指定 TextView 上的自定义字体,在 RemoteViews 中不可用。

你的意思是说在自定义通知布局中无法使用我的自定义字体?我在一些应用程序中看到过通知中有自定义字体。 - hassan moradnezhad
1
@hassanmoradnezhad:然后他们将该文本以该字体呈现为位图,并显示该位图。从可访问性的角度来看,这不是一个好选择。 - CommonsWare
谢谢,我找到了这篇文章,对我很有帮助。 - hassan moradnezhad

1

有两种解决方法可能会有所帮助。

1- 如果您仅能显示AppWidget设置的文本,则可以使用SpannableStrings和TypefaceSpans(以及Stylespans用于加粗等)来实现此目的。您可以使用常规的setTextViewText调用来设置SpannableString。

2- 如果您实际上需要更改TextView的字体系列,以便未来的文本显示为字体系列,则这更难。正如CommonsWare所述,您无法使用RemoteViews以编程方式设置任意字体系列。但是,如果您有一组较小的预定义字体(或字体重量,例如加粗等),则可以通过一种方法来实现此目的。这并不美观,但如果字体数量和变化相当受控制,则可以奏效。

在我的情况下,我正在使用TextClock创建一个时钟AppWidget。由于文本更新不受AppWidget控制,因此我无法使用SpannableStrings。我想提供6种内置字体选项。我在布局文件中创建了6个TextClock,每个都有不同的字体,在配置时只需使我想要的一个可见,其他的则"gone"。丑陋但有效。

appwidget_layout.xml

<TextClock
    android:id="@+id/clock_seconds_condensed"
    android:fontFamily="sans-serif-condensed"
    ....
/>
<TextClock
    android:visibility="gone"
    android:id="@+id/clock_seconds_normal"
    android:fontFamily="sans-serif"
    ....
/>
<TextClock
    android:visibility="gone"
    android:id="@+id/clock_seconds_black"
    android:fontFamily="sans-serif-black"
    ....
/>
...

配置活动。
//Which font do we want? Choose that clock
val clockid = when (fontFamily) {
    "san-serif" -> R.id.clock_seconds_normal
    "sans-serif-light" -> R.id.clock_seconds_light
    "sans-serif_black" -> R.id.clock_seconds_black
    "sans-serif-thin" -> R.id.clock_seconds_thin
    "sans-serif-medium" -> R.id.clock_seconds_medium
    else -> R.id.clock_seconds_condensed
}

//Hide all the other clocks
if (clockid != R.id.clock_seconds_normal) views.setInt(R.id.clock_seconds_normal, "setVisibility", View.GONE)
if (clockid != R.id.clock_seconds_light) views.setInt(R.id.clock_seconds_light, "setVisibility", View.GONE)
if (clockid != R.id.clock_seconds_black) views.setInt(R.id.clock_seconds_black, "setVisibility", View.GONE)
if (clockid != R.id.clock_seconds_thin) views.setInt(R.id.clock_seconds_thin, "setVisibility", View.GONE)
if (clockid != R.id.clock_seconds_medium) views.setInt(R.id.clock_seconds_medium, "setVisibility", View.GONE)
if (clockid != R.id.clock_seconds_condensed) views.setInt(R.id.clock_seconds_condensed, "setVisibility", View.GONE)

//Set clock parameters
views.setInt(clockid, "setVisibility", View.VISIBLE)
....

-3

1
你的链接是针对小部件而不是RemoteViews - CommonsWare

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