2

有些应用程序可以更改主屏幕小部件中文本的字体大小。一个例子是https://play.google.com/store/apps/details?id=org.zooper.zwfree

但是,主屏幕小部件只能携带RemoteViews,因此动态textSize设置a将不起作用。TextView

正如我所看到的,动态更改文本大小有两种可能性:

  • 为每个文本大小添加另一个 layout.xml 文件。这些文件仅在TextView'stextSize值上有所不同。当用户想要更改文本大小时,必须加载相应的布局。

  • 绘制位图而不是像这里创建视图https://stackoverflow.com/a/4411060/883083

我的问题是:还有第三种可能吗?

4

1 回答 1

2

如果您的目标是 API 级别 16 或更高,您可以尝试以下操作:

可悲的是,整个事情取决于知道小部件的大小,这只能在 API 16+ 中实现。

  1. 覆盖AppWidgetProvider.onAppWidgetOptionsChanged回调
    或稍后通过AppWidgetManager.getAppWidgetOptions获取相同的 Bundle
  2. 提取小部件的大小:
    • options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
    • options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
    • options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
    • options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)
  3. 从小部件大小中推断出你TextView的宽度
    (最好将它match_parent放在小部件的根部,注意边距/填充)
  4. 如果您有复杂的布局,您可以选择
    • 为您的应用空间中的整个小部件充气
      widget = LayoutInflater.from(context).inflate(R.layout.widget, null)
    • 模拟基于框架的布局:
      widget.measure(MeasureSpec.makeMeasureSpec(widgetWidth, MeasureSpec.EXACTLY), ...)
    • 获取您TextView的尺寸:widget.findViewById(R.id.myText).getMeasuredWidth()
  5. 使用类似refitText这里的东西来找到你的最佳尺寸
  6. 通过RemoteViews.setTextViewTextSize设置计算的大小

注:这个方法我没有实现,只是想了一下。

尽量不要在每次更新时都这样做,缓存结果(即使在首选项中),小部件选项不应该经常更改。

于 2014-10-15T12:28:29.763 回答