如何使android小部件布局响应

时间:2013-06-16 22:10:02

标签: android android-widget

我正在为我的Android应用程序构建一个小部件,它上面会有几个按钮。根据窗口小部件的大小,我希望窗口小部件上的按钮数量增长和缩小。这是4x1视图中目前的样子: 4x1 widget

当你缩小到3x1时: 3x1

是否有动态隐藏3x1视图中的第4个按钮,以便其他3个按钮不会被压扁?同样适用于2x1或1x1。对此的任何意见将不胜感激!

谢谢!

4 个答案:

答案 0 :(得分:11)

像他们已经说过的那样。您可以使用 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 (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;可视性。

enter image description here

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回调:每当布局大小发生变化时都会触发。但是,我真的没办法(现在)确定你的小部件占用的屏幕空间的实际数量,所以没有好办法根据大小改变按钮的可见性。