我正在为我的Android应用程序构建一个小部件,它上面会有几个按钮。根据窗口小部件的大小,我希望窗口小部件上的按钮数量增长和缩小。这是4x1视图中目前的样子:
当你缩小到3x1时:
是否有动态隐藏3x1视图中的第4个按钮,以便其他3个按钮不会被压扁?同样适用于2x1或1x1。对此的任何意见将不胜感激!
谢谢!
答案 0 :(得分:11)
所以我的主张是
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 (column) {
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;
}
答案 1 :(得分:8)
正如所建议的那样,除了在窗口小部件提供程序中实现onAppWidgetOptionsChanged
之外别无他法 - API级别&lt;不幸的是,有16位用户没有使用此功能。
为了在窗口小部件缩小时隐藏按钮,您的窗口小部件的行为类似于Android设计站点中的示例,在模式&#34; Widgets&#34; (实际上是appwidgets)。随着窗口小部件缩小,显示更少的按钮,随着窗口的增长,显示更多按钮,设置按钮&#39;可视性。
在onAppWidgetOptionsChanged
中,使用newOptions捆绑包提供的值,您必须检测宽度和高度的变化,并按照文档中的建议设置大小存储桶(来自同一个设计页面) ):
事实上,当用户调整窗口小部件的大小时,系统将响应一个 dp大小范围,您的小部件可以重绘自己。规划你的 小工具调整策略跨越&#34;大小桶&#34;而不是变数 网格尺寸将为您提供最可靠的结果。
真正具有挑战性的是如何确定这些存储桶。 newOptions Bundle的min_width,min_height,max_width和max_height值在设备,屏幕密度,启动器等之间存在很大差异。不幸的是,Android团队没有向我们展示如何执行此操作,并且onAppWidgetOptionsChanged
的代码示例很少在网络上,大多数都很简单。
答案 2 :(得分:4)
从版本4.1(api级别16)开始,有一个新函数getAppWidgetOptions(),它返回带有一些大小调整参数的Bundle。见here。也许您可以根据需要使用它,但是对于4.1以下的版本,没有类似的选项。
答案 3 :(得分:0)
您可以尝试收听onAppWidgetOptionsChanged回调:每当布局大小发生变化时都会触发。但是,我真的没办法(现在)确定你的小部件占用的屏幕空间的实际数量,所以没有好办法根据大小改变按钮的可见性。