web-dev-qa-db-fra.com

Comment ajouter plusieurs widgets dans la même application?

Je viens de terminer mon widget Android. Maintenant, je dois avoir différentes tailles de ce widget pour que l'utilisateur puisse choisir.

Par exemple, j'ai besoin d'un widget de taille moyenne, petite et grande, donc lorsque l'utilisateur installe l'application et maintenez l'écran d'accueil puis choisissez widget, dans le menu widget, je veux qu'il voit trois widgets avec le même nom d'application mais avec la taille . Quelque chose comme ça:

bonjour petit bonjour bonjour moyen grand

J'ai le moyen prêt, mais comment puis-je ajouter le petit et le grand dans la même application? Sachant que les trois tailles contiennent les mêmes données et actions exactes, seules la taille et l'arrière-plan sont différents.

62
BarcaDroid

Vous avez besoin d'une définition de récepteur pour chaque type dans votre fichier manifeste comme:

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

Cela vous permettrait d'utiliser la même classe AppWidgetProvider pour plusieurs widgets, avec différents noms de widgets et différentes tailles définies dans le <appwidget-provider> XML.

Maintenant, si vous avez besoin de plus de différences dans vos widgets que dans le <appwidget-provider> XML Je créerais une classe de widget de base qui implémente tous les comportements communs entre les différents types:

public abstract class MyBaseWidget extends AppWidgetProvider

Et puis chacune de vos implémentations concrètes pourrait étendre MyBaseWidget. Ensuite, dans votre fichier manifeste, vous auriez une définition de récepteur pour chacune de vos implémentations concrètes comme:

    <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>
101
Mark B

En fait, Android: le nom de chaque widget doit être différent. Si vous faites cela comme dans l'exemple, un seul widget sera visible dans la liste des widgets.

26
korro

Les gars, j'ai eu le même problème.

Vous devez également ajouter un deuxième fournisseur de widgets;

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

Prendre plaisir

11
jblz

Ok donc en gros vous aurez besoin de:

fichier de mise en page pour chaque widget. ex: main_small.xml, main_medium.xml ...

dans le répertoire xml, ajoutez un fournisseur pour chaque widget. ex: small_provider.xml, medium_provider.xml ... et ainsi de suite (notez que si vous n'avez pas de répertoire xml, ajoutez-le sous le répertoire drawable).

maintenant quoi!

  • définir un récepteur dans le widget pour chacun du manifeste. (tout comme l'exemple de la réponse principale)

  • vous pouvez utiliser la même disposition ou une disposition différente. c'est à vous de décider.

  • dans votre fournisseur, vous devriez avoir quelque chose comme ceci:

<?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"
    />

assurez-vous que chaque fournisseur spécifie le fichier de mise en page cible que vous souhaitez utiliser. dans ce code, je demande le fichier main.xml dans le répertoire de mise en page. pour mon widget moyen par exemple, j'aurai un autre fournisseur avec le même code exact mais je changerai la dernière ligne

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

J'espère que cela aide, sinon faites le moi savoir et je peux télécharger un exemple de travail sur mon site Web et vous pouvez y regarder de plus près. s'il vous plaît laissez-moi savoir comment ça se passe.

bonne chance.

5
user308238

Quelques informations supplémentaires pour les autres réponses ...

  • Si vous dupliquez les fichiers mentionnés et si votre widget utilise un Service pour fournir certaines fonctionnalités, vous devrez peut-être dupliquer votre service.

  • Si vous dupliquez votre Service, n'oubliez pas de mettre à jour votre manifeste avec le nouveau service, sinon le nouveau service ne fonctionnera pas ...

Cela m'a fait perdre du temps.


Si vous utilisez un BroadcastReceiver pour envoyer des Intent à votre Services en double ... n'oubliez pas de mettre à jour ce code aussi:

  • vous devez maintenant envoyer des intentions à chaque des services.
0
Richard Le Mesurier