如果您的目标是 API 级别 16 或更高,您可以尝试以下操作:
可悲的是,整个事情取决于知道小部件的大小,这只能在 API 16+ 中实现。
- 覆盖AppWidgetProvider.onAppWidgetOptionsChanged回调
或稍后通过AppWidgetManager.getAppWidgetOptions获取相同的 Bundle
- 提取小部件的大小:
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)
- 从小部件大小中推断出你
TextView
的宽度
(最好将它match_parent
放在小部件的根部,注意边距/填充)
- 如果您有复杂的布局,您可以选择
- 为您的应用空间中的整个小部件充气
widget = LayoutInflater.from(context).inflate(R.layout.widget, null)
- 模拟基于框架的布局:
widget.measure(MeasureSpec.makeMeasureSpec(widgetWidth, MeasureSpec.EXACTLY), ...)
。
- 获取您
TextView
的尺寸:widget.findViewById(R.id.myText).getMeasuredWidth()
- 使用类似
refitText
这里的东西来找到你的最佳尺寸
- 通过RemoteViews.setTextViewTextSize设置计算的大小
注:这个方法我没有实现,只是想了一下。
尽量不要在每次更新时都这样做,缓存结果(即使在首选项中),小部件选项不应该经常更改。