結合上面的答案和一個可愛的代碼剪斷,從https://stackoverflow.com/a/7875656/6364860,我知道了這樣的工作:
*注意我有一個帶有文字的圓形按鈕,所以我只需要最小的尺寸。
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions){
super.onAppWidgetOptionsChanged(context,appWidgetManager,appWidgetId,newOptions);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
int maxWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int maxHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int size = Math.min(maxHeight,maxWidth);
int pxSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,size,context.getResources().getDisplayMetrics());
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_button);
float newSize = refitText(context.getString(R.string.button_text),pxSize);
remoteViews.setTextViewTextSize(R.id.widget_text, TypedValue.COMPLEX_UNIT_PX,newSize);
appWidgetManager.updateAppWidget(appWidgetId,remoteViews);
}
}
private float refitText(String text, int textWidth)
{
if (textWidth <= 0)
return 0;
float hi = 100;
float lo = 2;
final float threshold = 0.5f; // How close we have to be
Paint testPaint = new Paint();
while((hi - lo) > threshold) {
float size = (hi+lo)/2;
testPaint.setTextSize(size);
if(testPaint.measureText(text) >= textWidth)
hi = size; // too big
else
lo = size; // too small
}
// Use lo so that we undershoot rather than overshoot
return lo;
}
作爲對後來讀者的一個注意事項,我可以說API16+是可以做到的。有一個你可以在你的widget中覆蓋的回調方法:onAppWidgetOptionsChanged,並且從這個方法中你可以得到最大寬度和高度(如下面的一些指出)。但是在API 16之下,調整大小並不容易。 – zaifrun