如何在一个应用程序中添加多个小部件?

我刚刚完成了我的Android小部件。 现在我需要有不同大小的这个wiget供用户select。 例如我需要一个中等大小的小部件。 所以当用户安装应用程序,并按住主屏幕,然后select小部件,在小部件菜单中,我希望他看到三个具有相同的应用程序名称,但大小与小部件。 像这样的东西:

helloSmall helloMedium helloLarge

我有中等准备,但我怎么能在同一个应用程序中的小和大? 知道所有三个尺寸包含相同的确切数据和行动只是大小和背景是不同的。

谢谢。

您需要清单文件中每种types的接收者定义,如:

<receiver android:name=".MyWidget" android:label="@string/medium_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/medium_widget_provider" /> </receiver> <receiver android:name=".MyWidget" android:label="@string/large_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/large_widget_provider" /> </receiver> 

这将允许您为多个小部件使用相同的AppWidgetProvider类,并在<appwidget-provider> XML中定义不同的小部件名称和不同的大小。

现在,如果你需要比<appwidget-provider> XML中的更多的差异,我会创build一个基类部件类来实现不同types之间的所有常见行为:

 public abstract class MyBaseWidget extends AppWidgetProvider 

然后,每个具体的实现可以扩展MyBaseWidget。 然后在您的清单文件中,您将拥有每个具体实现的接收者定义,如:

  <receiver android:name=".MyMediumWidget" android:label="@string/medium_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/medium_widget_provider" /> </receiver> <receiver android:name=".MyLargeWidget" android:label="@string/large_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/large_widget_provider" /> </receiver> 

实际上,每个小部件的android:name必须不同。 如果您将以示例的方式执行此操作,则窗口小部件列表中只会显示一个窗口小部件。

伙计们,我有同样的问题。

您还需要实际添加第二个窗口小部件提供程序;

 <receiver android:name=**".MyWidget**" android:label="@string/medium_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/medium_widget_provider" /> </receiver> <receiver android:name=**".MyWidget2"** android:label="@string/large_widget_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/large_widget_provider" /> </receiver> 

请享用

好吧,基本上你需要:

布局文件在每个部件前面。 例如:main_small.xml,main_medium.xml …

在xml目录中为每个小部件添加一个提供程序。 例如:small_provider.xml,medium_provider.xml …等等(注意,如果没有xml目录,则将其添加到drawable目录下)。

怎么办!

  • 在清单中为每个小部件定义一个接收器。 (就像主要答案中的例子)

  • 您可以使用相同的布局或不同的布局。 基本上这取决于你。

  • 在你的提供者你应该有这样的东西:

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dip" android:minHeight="138dip" android:updatePeriodMillis="10000" android:initialLayout="@layout/main" /> 

确保为每个提供者指定要使用的目标布局文件。 在这个代码中,我要求layout文件夹中的文件main.xml。 对于我的中等小部件,例如我会有另一个提供者具有相同的确切代码,但我会改变最后一行

 > android:initialLayout="@layout/medium". 

我希望这可以帮助,如果不让我知道,我可以在我的网站上传一个工作的例子,你可以仔细看看它。 请让我知道如何去。

祝你好运。

一些额外的信息,以其他答案…

  • 如果您复制了所提及的文件,并且您的小部件使用Service提供某些function,则可能需要复制服务。

  • 如果您复制您的Service请记得用新服务更新您的清单 ,否则新服务将不会运行…

这浪费了我一些时间。


如果您使用任何BroadcastReceiverIntent发送到您的重复Service …不要忘记更新该代码:

  • 你现在必须发送意向到每个服务。