第三方启动器中是否可以定义小部件的调整和方向变化行为/布局?

3

我似乎找不到关于我要编写的小部件以下问题的任何信息: 除了在Android 3.1引入的可调整大小功能外,我希望我的小部件可以在LauncherPro或ADWLauncher等自定义启动器中调整大小。我能否定义我的小部件在调整大小后如何更改其布局?例如,按钮A在2x1上显示在左侧,但在3x3上显示在右侧。 此外,当由于屏幕旋转小部件大小发生变化时(例如,3x1在横向和纵向上具有不同的高度和宽度),我也希望它能够更改其外观/布局。

任何提示都将很有帮助。 非常感谢! 蒂尔

2个回答

8

从Android 4.1开始,可以使用onAppWidgetOptionsChanged()方法来获取小部件在调整大小时的尺寸并更改布局。因此,在您的AppWidgetProvider中:

@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle bundle) {
        int minWidth = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
        int maxWidth = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
        int minHeight = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
        int maxHeight = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
        RemoteViews rv = null;
        //Size of a 2x1 widget on a Nexus 4 (other screen densities will differ)
        if(minWidth == 152 && maxWidth == 196 && minHeight == 58 && maxHeight == 84){
            rv = new RemoteViews(context.getPackageName(), R.layout.widget2x1);
        } else {
            rv = new RemoteViews(context.getPackageName(), R.layout.widget);
        }
        ...
        /* Set some stuff in your layout here */
        ...
        appWidgetManager.updateAppWidget(appWidgetId, rv);
}

问题在于您需要找到每个屏幕密度/大小的最小/最大宽度和高度,以便知道当小部件调整大小一定量以保证布局更改时。


1
感谢您的回答,但请注意OPTION_APPWIDGET_*的值以dp为单位报告。也就是说,您所提到的密度问题并不存在。 - Zsolt Safrany
1
你应该定义区间而不是使用 == 运算符。这将使您的布局选择在不同的主屏幕之间更加稳健。 - Zsolt Safrany

0
有没有办法定义我的小部件在调整大小后如何更改其布局?
您的应用程序小部件在调整大小后不会更改其布局。
例如,对于2x1,按钮A显示在左侧,但对于3x3,则显示在右侧。
这不是可调整大小的应用程序小部件的目的。调整大小是为了使用ListView、GridView等,它们将吸收额外的可滚动空间。
此外,我希望当由于屏幕旋转而更改小部件大小时(例如,3x1在横向和纵向上具有不同的高度和宽度),它也可以更改其外观/布局。
为此,您应该能够使用标准方向资源集(例如,res/layout/和res/layout-land/)。

1
感谢您的快速回复。因此,根据小部件的大小选择所需的布局是唯一具有不同(-ly结构化)元素的方法,这取决于用户在小部件安装时的大小选择(例如,Winamp小部件包括4x2专辑封面,而不包括4x1)。为了允许第三方启动器进行适当的即时调整大小,我唯一能考虑的事情就是避免固定的宽度和高度值,以便组件实际上可以吸收额外的空间。 - Till - Appviewer.io
你可能不应该在调整大小时更改布局,但我找到了至少一个例子:三星的“Accuweather.com”小部件,它预装在Galaxy S II、Galaxy Tab 7.0 Plus、Galaxy Note等设备上。当你调整小部件的大小时,它会改变布局。 - christoff
1
@christoff:除非在第三方主屏幕上也表现出相同的行为,否则您所看到的可能是伪应用小部件和三星主屏幕之间的专有内容。主屏幕的实施者可以创建“应用小部件”,这些小部件实际上并不是应用小部件,而是主屏幕应用程序本身的功能,并且可以执行各种额外的操作。 - CommonsWare
这很奇怪,因为设计指南明确提到:“您将需要动态调整小部件的内容和布局,以适应用户通过调整大小操作定义的尺寸。”(http://developer.android.com/design/patterns/widgets.html) - Zsolt Safrany
@ZsoltSafrany:这个答案是两年前的,自那时以来应用程序小部件的调整大小已经发生了变化。 - CommonsWare
显示剩余2条评论

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