67 votes

comment ajouter plusieurs widgets dans une seule application?

Je viens de terminer mon widget Android. Maintenant, j'ai besoin d'avoir des tailles différentes de ce wiget pour l'utilisateur de choisir à partir. par exemple, j'ai besoin d'une taille moyenne, petite et grande taille du widget. ainsi, lorsque l'utilisateur installe l'application et maintenez l'écran d'accueil, puis choisissez widget, dans le widget menu que je veux lui voir trois widget avec le même nom de l'application, mais avec la taille. quelque chose comme ceci:

helloSmall helloMedium helloLarge

J'ai le moyen d'un prêt, mais comment puis-je faire les petits et les grands dans la même application? sachant que les trois tailles contiennent exactement les mêmes données et les actions de juste la taille et le contexte sont différents.

Merci.

103voto

mbaird Points 31293

Vous avez besoin d'un récepteur de la définition de 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'avoir le même AppWidgetProvider classe être utilisé pour de multiples widgets, avec différents widget noms et différentes tailles définies dans l' <appwidget-provider> XML.

Maintenant, si vous avez besoin de plus des différences dans vos widgets que ce qui est dans l' <appwidget-provider> XML je voudrais créer une base de widget de la classe qui implémente toutes les communes de comportement entre les différents types:

public abstract class MyBaseWidget extends AppWidgetProvider

Et puis chacun de vos des implémentations concrètes pourraient s'étendre MyBaseWidget. Ensuite dans votre fichier de manifeste de vous aurait un récepteur définition pour chacun de vos des 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>

27voto

korro Points 391

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

11voto

jblz Points 96

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

Vous avez besoin d'ajouter un deuxième fournisseur du widget aswell;

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

Profitez de

5voto

user308238 Points 51

Ok donc, fondamentalement, vous aurez besoin de:

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

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

maintenant ce qui!

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

  • vous pouvez utiliser la même mise en page ou différente, de mise en page. fondamentalement, ce est à vous.

  • 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, pour chaque fournisseur de spécifier la mise en page cible fichier que vous souhaitez utiliser. dans ce code je vous demande le fichier main.xml dans la mise en page du répertoire. pour ma moyenne widget par exemple je vais avoir un autre fournisseur avec exactement le même code, mais je vais changer la dernière ligne

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

J'espère que cette aide si non faites le moi savoir et je peux télécharger un exemple de travail sur mon site et vous pouvez prendre un coup d'oeil plus proche. s'il vous plaît laissez-moi savoir comment ça se passe.

le meilleur de la chance.

2voto

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

  • Si vous êtes dupliquer les fichiers mentionnés, et si votre widget utilise un Service de fournir certaines fonctionnalités, vous pourriez avoir à 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 fonctionne pas...

Cela a gâché un peu de temps pour moi.


Si vous utilisez n'importe quel BroadcastReceiver envoyer Intents de votre double Services... n'oubliez pas de mettre à jour ce code:

  • vous devez maintenant envoyer les intentions de chacun des services.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X