首页 文章

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

提问于
浏览
61

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

helloSmall helloMedium helloLarge

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

谢谢 .

5 回答

  • 100

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

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

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

  • 5

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

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

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

    请享用

  • 0

    好的,基本上你需要:

    每个小部件前的布局文件 . 例如:main_small.xml,main_medium.xml ......

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

    怎么办!

    • 在清单 for each 小部件中定义接收器 . (就像主要答案中的例子一样)

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

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

    <?xml version =“1.0”encoding =“utf-8”?>

    <appwidget-provider xmlns:android =“http://schemas.android.com/apk/res/android”
    机器人:minWidth = “146dip”
    机器人:=了minHeight “138dip”
    机器人:updatePeriodMillis = “10000”
    机器人:initialLayout = “@布局/主”
    />

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

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

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

    祝你好运 .

  • 11

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

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

    • 如果您复制 Serviceremember to update your manifest with the new service ,否则新服务将无法运行...

    这浪费了一些时间给我 .


    如果您使用任何 BroadcastReceiverIntent 发送到您的副本 Service ...请不要忘记更新该代码:

    • 您现在必须向 each 服务发送意图 .

相关问题