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

时间:2010-04-03 02:04:20

标签: android android-widget

我刚刚完成了我的Android小部件。现在我需要有不同大小的这个小部件供用户选择。

例如,我需要一个中型,小型和大型小部件,因此当用户安装应用程序并按住主屏幕然后选择小部件时,在小部件菜单中我希望他看到三个具有相同应用程序名称的小部件但是与大小。像这样:

helloSmall helloMedium helloLarge

我已准备好中型,但如何在同一个应用中添加小型和大型?知道所有三种尺寸都包含相同的确切数据和动作,只是尺寸和背景不同。

5 个答案:

答案 0 :(得分:101)

您需要清单文件中每种类型的接收器定义,如:

    <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中的更多差异,我将创建一个基本小部件类,实现不同类型之间的所有常见行为:

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>

答案 1 :(得分:26)

实际上,android:每个小部件的名称必须不同。如果您将在示例中执行此操作,则在窗口小部件列表中只能看到一个窗口小部件。

答案 2 :(得分:11)

伙计们,我遇到了同样的问题。

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

<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>

享受

答案 3 :(得分:5)

好的,基本上你需要:

每个小部件前面的

布局文件。例如: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"
    />

确保为每个提供程序指定要使用的目标布局文件。在这段代码中,我要求布局目录中的文件main.xml。对于我的中型小部件,例如我将有另一个提供商具有相同的确切代码,但我将更改最后一行

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

我希望如果不让我知道这有帮助,我可以在我的网站上传一个工作示例,你可以仔细看看它。请让我知道它是怎么回事。

祝你好运。

答案 4 :(得分:0)

其他答案的一些额外信息......

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

  • 如果您复制Service请记得使用新服务更新您的清单,否则新服务将无法运行...

这对我浪费了一些时间。


如果您使用任何BroadcastReceiverIntent发送到您的重复Service ...请勿忘记更新该代码:

  • 您现在必须向每个服务发送意图。