Android主屏幕小部件动态文本化

时间:2014-02-07 22:28:42

标签: android android-widget android-remoteview

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

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

我认为有两种方法可以动态更改文本大小:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

可悲的是,整个过程取决于知道小部件的大小,这只能在API 16 +中使用。

  1. 覆盖AppWidgetProvider.onAppWidgetOptionsChanged回拨
    或者稍后通过AppWidgetManager.getAppWidgetOptions
  2. 获得相同的Bundle
  3. 提取小部件的大小:
    • 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)
  4. 从小部件尺寸中减去TextView的宽度 (最好的,如果你有match_parent到小部件的根,请注意边距/填充)
  5. 如果你有复杂的布局,你可以选择
    • 在您的应用空间中展开整个小部件 widget = LayoutInflater.from(context).inflate(R.layout.widget, null)
    • 根据the framework模拟布局:
      widget.measure(MeasureSpec.makeMeasureSpec(widgetWidth, MeasureSpec.EXACTLY), ...)
    • 获取TextView的尺寸:widget.findViewById(R.id.myText).getMeasuredWidth()
  6. 使用类似refitText here的内容来查找最佳尺寸
  7. 通过RemoteViews.setTextViewTextSize
  8. 设置计算出的尺寸

    注意:我没有实现这个方法,只是考虑过它。

    尽量不要在每次更新时执行此操作,缓存结果(即使在首选项中),窗口小部件选项也不应经常更改。