我正在为我的 Android 应用程序构建一个小部件,上面有几个按钮。根据小部件的大小,我希望小部件上的按钮数量增加和缩小。这是它目前在 4x1 视图中的样子:
当你把它缩小到 3x1 时:
是否有动态隐藏 3x1 视图中的第 4 个按钮,以便其他 3 个按钮不会被压扁?同样适用于 2x1 或 1x1。对此的任何意见将不胜感激!
谢谢!
我正在为我的 Android 应用程序构建一个小部件,上面有几个按钮。根据小部件的大小,我希望小部件上的按钮数量增加和缩小。这是它目前在 4x1 视图中的样子:
当你把它缩小到 3x1 时:
是否有动态隐藏 3x1 视图中的第 4 个按钮,以便其他 3 个按钮不会被压扁?同样适用于 2x1 或 1x1。对此的任何意见将不胜感激!
谢谢!
就像他们已经说过的那样。您可以使用onAppWidgetOptionsChanged
所以我的提议是
1)制作不同的布局。带有 3 和 4 按钮。
2)根据小部件列数更改布局。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
// See the dimensions and
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
// Get min width and height.
int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
// Obtain appropriate widget and update it.
appWidgetManager.updateAppWidget(appWidgetId, getRemoteViews(context, minWidth, minHeight));
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
}
/**
* Determine appropriate view based on row or column provided.
*
* @param minWidth
* @param minHeight
* @return
*/
private RemoteViews getRemoteViews(Context context, int minWidth, int minHeight) {
// First find out rows and columns based on width provided.
int rows = getCellsForSize(minHeight);
int columns = getCellsForSize(minWidth);
// Now you changing layout base on you column count
// In this code from 1 column to 4
// you can make code for more columns on your own.
switch (columns) {
case 1: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_1column);
case 2: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_2column);
case 3: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_3column);
case 4: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column);
default: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column);
}
}
/**
* Returns number of cells needed for given size of the widget.
*
* @param size Widget size in dp.
* @return Size in number of cells.
*/
private static int getCellsForSize(int size) {
int n = 2;
while (70 * n - 30 < size) {
++n;
}
return n - 1;
}
正如建议的那样,除了在您的小部件提供程序中实现之外别无他法onAppWidgetOptionsChanged
- 不幸的是,API 级别 < 16 的用户将没有此功能。
为了在小部件缩小时隐藏按钮,您的小部件的行为需要类似于 Android 设计网站中作为示例给出的天气小部件,在模式“小部件”(实际上是 appwidgets)下。您在小部件缩小时显示较少按钮,在其增长时显示更多按钮,设置按钮的可见性。
在onAppWidgetOptionsChanged
中,使用 newOptions Bundle 给出的值,您必须检测宽度和高度的变化,并按照文档中的建议设置大小桶(来自同一设计页面):
事实上,当用户调整小部件的大小时,系统将响应一个 dp 大小范围,您的小部件可以在该范围内重新绘制自身。跨“大小桶”而不是可变网格尺寸规划小部件调整大小策略将为您提供最可靠的结果。
真正具有挑战性的是如何确定这些桶。newOptions Bundle 的 min_width、min_height、max_width 和 max_height 值在设备、屏幕密度、启动器等之间存在很大差异。不幸的是,Android 团队没有向我们展示如何做到这一点,而且onAppWidgetOptionsChanged
网络上的代码示例很少,大多数其中非常简单。
从 4.1 版(api 级别 16)开始,有一个新函数 getAppWidgetOptions() 返回一个带有一些大小参数的 Bundle。见这里。也许您可以根据需要使用它,但是 afaik 对于 4.1 以下的版本没有类似的选项。
您可以尝试收听onAppWidgetOptionsChanged回调:只要布局大小发生变化,它就会触发。但是,我真的没有办法(现在)确定您的小部件占用的实际屏幕空间量,因此没有根据大小更改按钮可见性的好方法。