【问题标题】:How to make android widget layout responsive如何使android小部件布局响应
【发布时间】:2020-05-31 14:33:25
【问题描述】:

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

当你把它缩小到 3x1 时:

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

谢谢!

【问题讨论】:

  • 你设计规则的人!

标签: android android-widget


【解决方案1】:

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

【讨论】:

  • 未来的读者,请参阅 this 了解更多关于 options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); 返回的信息。
  • 嗨,您能解释一下您为什么要为getCellsForSize() 做的事情吗?谢谢
  • @JacktheRipper 谢谢 :)
  • 这可能会使用一些清理,因为它只会在调整大小而不是在重新启动后创建/加载时更改布局。
【解决方案2】:

正如建议的那样,除了在小部件提供程序中实现 onAppWidgetOptionsChanged 之外别无他法 - 不幸的是,API 级别

为了在小部件缩小时隐藏按钮,您的小部件的行为需要类似于 Android 设计网站中作为示例给出的天气小部件,模式为“Widgets”(实际上是 appwidgets)。随着小部件的缩小,您显示的按钮更少,随着它的增长显示更多的按钮,从而设置按钮的可见性。

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

事实上,当用户调整小部件的大小时,系统会响应 dp 大小范围,您的小部件可以在其中重绘自身。规划你的 跨“大小桶”而不是变量的小部件调整大小策略 网格尺寸将为您提供最可靠的结果。

真正具有挑战性的是如何确定这些桶。 newOptions Bundle 的 min_width、min_height、max_width 和 max_height 值在设备、屏幕密度、启动器等之间存在很大差异。不幸的是,Android 团队没有向我们展示如何做到这一点,并且onAppWidgetOptionsChanged 中的代码示例很少web,大部分都非常简单。

【讨论】:

    【解决方案3】:

    从 4.1 版(api 级别 16)开始,有一个新函数 getAppWidgetOptions() 返回一个带有一些大小参数的 Bundle。见here。也许您可以根据需要使用它,但是 afaik 对于 4.1 以下的版本没有类似的选项。

    【讨论】:

      【解决方案4】:

      您可以尝试收听onAppWidgetOptionsChanged 回调:只要布局大小发生变化,它就会触发。但是,我确实没有办法(现在)确定您的小部件占用的实际屏幕空间量,因此没有根据大小更改按钮可见性的好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多