Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在同一个应用程序中添加多个小部件?_Android_Android Widget - Fatal编程技术网

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

Android 如何在同一个应用程序中添加多个小部件?,android,android-widget,Android,Android Widget,我刚刚完成我的Android小部件。现在我需要有不同大小的这个小部件供用户选择 例如,我需要一个中、小和大尺寸的小部件,因此当用户安装应用程序并保持主屏幕时,然后选择小部件,在小部件菜单中,我希望他看到三个具有相同应用程序名称但大小相同的小部件。大概是这样的: helloSmall 海洛米酒店 希腊语 我已经准备好了中号的,但是如何在同一个应用程序中添加小的和大的呢?知道所有三种大小都包含相同的精确数据和操作,只是大小和背景不同。您需要清单文件中每种类型的接收器定义,如: <rec

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

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

helloSmall 海洛米酒店 希腊语


我已经准备好了中号的,但是如何在同一个应用程序中添加小的和大的呢?知道所有三种大小都包含相同的精确数据和操作,只是大小和背景不同。

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

    <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>
然后,您的每个具体实现都可以扩展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>

好的,因此基本上您需要:

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

在xml目录中,为每个小部件添加一个提供程序。例如:small\u provider.xml、medium\u provider.xml。。。依此类推(请注意,如果没有xml目录,请将其添加到drawable目录下)

现在怎么办

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

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

  • 在您的提供商中,您应该有如下内容:

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


祝你好运。

实际上,安卓:每个小部件的名称必须不同。如果您像示例中那样执行此操作,则在窗口小部件列表中只有一个窗口小部件可见。

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

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

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


享受

其他答案的额外信息

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

  • 如果复制
    服务
    请记住使用新服务更新清单,否则新服务将无法运行

这对我来说浪费了一些时间


如果您使用任何
BroadcastReceiver
Intent
s发送到重复的
服务
s。。。别忘了也要更新代码:

  • 您现在必须将意向发送到每个服务的

您好,谢谢您的回答。但似乎我不能共享同一个widget提供者。(如果我这样做,则只显示清单中的第一个)。因此,基本上,多个widget提供者将是我的答案。有人在使用一个widget提供者吗?是的,只是按照上面的说明进行操作,发现只有在我指定不同的widget提供者类时,它才有效。很好,谢谢大家!:)这里也一样,需要多个小部件提供程序类才能显示小部件。我无法使用相同的AppWidgetProvider类,因为我不知道如何以编程方式获取布局,也就是说,我的AppWidgetProvider中有这个类,它在其中构建视图:RemoteViews views=new RemoteView(context.getPackageName(),R.layout.widget);注意“R.layout.widget”,该值将根据清单中的不同而有所不同。是否有一种方法可以通过编程方式从AppWidgetProvider类获取小部件提供程序中定义的布局?如果没有,子类化是我们使用同一AppWidgetProvider类和不同布局的唯一选项。@WnRybear是,您使用的是
AppWidgetProviderInfo
。这样可以得到如下布局:
AppWidgetProviderInfo.initialLayout
。例如:
AppWidgetProviderInfo-appInfo=appWidgetManager.getAppWidgetInfo(widgetId);appInfo.initialLayout根据@jblz回答(澄清)是!!这就是问题所在!!我最终创建了另一个widget提供程序类,它只是扩展了第一个widget,然后在清单集中为两个widget创建了这两个类?
<?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"
    />
> android:initialLayout="@layout/medium".
<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>