如何使Android小部件布局具有响应性

9
我正在为我的Android应用程序构建一个小部件,它将有几个按钮。基于小部件的大小,我希望小部件上的按钮数量能够自动增加和缩小。以下是在4x1视图中的外观: 4x1 widget 当你将它缩小到3x1时: 3x1 是否有任何方法在3x1视图中动态隐藏第四个按钮,以便其他三个按钮不会被挤压?同样适用于2x1或1x1。非常感谢您的任何意见!
谢谢!

1
你设计规则了,伙计! - Piovezan
4个回答

14

就像他们已经说的一样。您可以使用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;
}

1
未来的读者,有关options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);返回的更多信息,请参见此处 - olfek
你好,能否请您解释一下为什么您对于getCellsForSize()做了这样的处理呢?谢谢。 - olfek
1
@daka https://developer.android.com/guide/practices/ui_guidelines/widget_design 确定窗口小部件的大小 - Jakub S.
@JacktheRipper 谢谢 :) - olfek
这段代码可能需要进行一些清理,因为它只在调整大小时更改布局,而不是在创建/加载后重启时更改。 - Charlie

9
正如建议的那样,您唯一的选择是在小部件提供程序中实现onAppWidgetOptionsChanged - 不幸的是,API级别<16的用户将没有此功能。
为了在小部件缩小时隐藏按钮,您的小部件需要类似于 Android 设计网站上的天气小部件示例,在 "Widgets"(实际上是应用小部件)模式下表现。随着小部件的缩小,显示较少的按钮,随着小部件的增大,显示更多的按钮,设置按钮的可见性。

enter image description here

onAppWidgetOptionsChanged中,使用newOptions Bundle提供的值,必须检测宽度和高度的变化,并按照文档中建议的方式设置大小桶(来自同一设计页面):

实际上,随着用户调整小部件的大小,系统将响应具有dp大小范围的操作,您的小部件可以在其中重新绘制自己。计划跨“大小桶”而不是可变网格尺寸的小部件调整策略将为您带来最可靠的结果。

真正具有挑战性的是如何确定这些桶。newOptions Bundle具有min_width、min_height、max_width和max_height值,这些值在设备、屏幕密度、启动器等方面有很大的差异。不幸的是,Android团队没有向我们展示如何做到这一点,在网络上也很少有关于onAppWidgetOptionsChanged的代码示例,其中大多数非常简单。

4
自4.1版本(API级别16)开始,有一个新的函数getAppWidgetOptions(),它返回一个包含一些尺寸参数的Bundle。请参见这里。也许你可以用它来满足你的需求,但据我所知,在4.1以下的版本中没有类似的选项。

0
你可以尝试监听onAppWidgetOptionsChanged回调:每当布局大小发生变化时,它应该触发。然而,目前我所见没有什么方法可以确定小部件实际占用的屏幕空间量,因此没有好的方法根据大小更改按钮可见性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接