如何更新不同大小的小部件?
Posted
技术标签:
【中文标题】如何更新不同大小的小部件?【英文标题】:How to update widgets of different sizes? 【发布时间】:2012-02-02 01:50:54 【问题描述】:我的应用支持多种尺寸的小部件,每个小部件都按照此处列出的方案how to add multiple widgets in one app?
它有一个处理所有小部件的抽象 BaseWidgetProvider 类。然后它被 android Manifest 中列出的空 WidgetProvider1/2/3/4 类(每个大小一个)子类化,一切正常。清单中的注册看起来像这样(1..4 的典型)
<receiver
android:name=".widget.MyWidgetProvider4"
android:label="My Widget size 4" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action
android:name="my.domain.BaseWidgetProvider.UPDATE_WIDGET" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_widget_info4" />
</receiver>
我的问题是关于从应用程序发送意图以使用新数据更新小部件。我找不到为所有 4 个提供者发送单个意图的方法,目前每次发送 4 个单独的意图
for (Class cls : BaseWidgetProvider.WIDGET_PROVIDER_CLASSES)
Intent intent = new Intent(mApp.context(), cls);
intent.setAction(BaseWidgetProvider.UPDATE_WIDGET);
this.sendBroadcast(intent);
在哪里
public static final Class[] WIDGET_PROVIDER_CLASSES = new Class[]
WidgetProvider4.class,
WidgetProvider1.class,
WidgetProvider2.class,
WidgetProvider3.class
;
这是向所有大小的小部件发送更新意图的最佳方式(请注意,通常用户只有零个或一个小部件)?
是否有合理的方式只发送一个意图?
有没有办法让一个接收器更新所有四种尺寸的小部件实例?
请注意,基本提供程序类不关心小部件的大小,并且对所有大小都完全相同。唯一的区别是用户屏幕上的初始小部件大小。如果用户调整小部件的大小(例如使用 Launcher Pro),它就可以正常工作。
【问题讨论】:
我试图为多个尺寸的小部件使用相同的链接,但我不知道如何实现基类。我只是android和java的初学者。因此,如果您可以发布所有解决方案或您遵循的步骤,那将非常有帮助。这对我以及其他陷入此问题的初学者非常有帮助。 【参考方案1】:在 Manifest 文件中的所有小部件提供者的声明中添加一个具有一个意图操作的意图过滤器,例如:
<intent-filter>
<action android:name="my.domain.blablabla.MY_SUPER_INTENT_TO_UPDATE_ALL" />
</intent-filter>
然后只需从您的应用程序中将这个意图作为广播发送。 在这种情况下,意图将由您的所有小部件提供者处理。
【讨论】:
这行得通,谢谢。我从意图中删除了目标类,所有小部件提供者现在都响应相同的意图。有没有办法让所有小部件尺寸都有一个接收器?对所有意图的处理都是相同的,因此没有必要计算 4 次。以上是关于如何更新不同大小的小部件?的主要内容,如果未能解决你的问题,请参考以下文章
当返回不同的小部件时,返回不同 StatefulWidgets 的方法不更新