2010-04-03 2 views
60

Ich habe gerade mein Android Widget fertig. Jetzt muss ich verschiedene Größen dieses wiget für den Benutzer zur Auswahl haben. zum Beispiel brauche ich ein mittleres, kleines und großes Widget. Wenn der Benutzer die App installiert und den Home-Bildschirm hält, dann wähle Widget, im Widget-Menü möchte ich, dass er drei Widget mit dem gleichen App-Namen, aber mit der Größe sieht. so etwas wie dieses:Wie Sie mehrere Widgets in einer App hinzufügen?

helloSmall helloMedium helloLarge

Ich habe das Medium eine fertig, aber wie kann ich die kleine und die große in der gleichen App machen? Da alle drei Größen genau dieselben Daten und Aktionen enthalten, unterscheiden sich Größe und Hintergrund.

Danke.

Antwort

96

Sie benötigen einen Empfänger Definition für jeden Typ in Ihrer Manifest-Datei wie:

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

Dies würde ermöglichen es Ihnen, die gleiche AppWidgetProvider Klasse haben für mehrere Widgets verwendet werden, mit verschiedenen Widget-Namen und verschiedenen Größen definiert in die <appwidget-provider> XML.

Nun, wenn Sie mehr Unterschiede in Ihren Widgets müssen als das, was in dem <appwidget-provider> XML ist, würde ich eine Basis-Widget-Klasse erstellen, die alle das gemeinsame behavoir zwischen den verschiedenen Arten implementiert:

public abstract class MyBaseWidget extends AppWidgetProvider 

Und dann jedes Ihrer Konkrete Implementierungen könnten MyBaseWidget erweitern. Dann in Ihrer Manifest-Datei würden Sie einen Empfänger Definition für jede Ihrer konkreten Implementierungen wie haben:

<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

Vielen Dank, dass seit !! Ich war sehr nah dran. Ich werde daran arbeiten und ich komme wieder mit einer Erfolgsmeldung oder mehr Fragen. Vielen Dank. – BarcaDroid

+6

Hallo, danke für deine Antwort. Aber es scheint, dass ich den gleichen Widget-Anbieter nicht teilen kann. (Wenn ich das tue, wird nur das erste im Manifest angezeigt). Also, im Grunde wären mehrere Widget-Anbieter die Antwort für mich. Arbeitet jemand mit einem Widgetanbieter? – xandy

+26

Yep, nur oben Anweisungen gefolgt und gefunden, es funktioniert nur, wenn ich andere Widget-Provider-Klassen angeben. Jedenfalls gut, danke an alle! :) – dimsuz

5

Ok so im Grunde brauchen Sie:

Layout-Datei Vordergrund jedes Widget. Beispiel: main_small.xml, main_medium.xml ...

Fügen Sie im XML-Verzeichnis einen Provider für jedes Widget hinzu. ex: small_provider.xml, medium_provider.xml ... und so weiter (wenn Sie kein xml-Verzeichnis haben, fügen Sie es unter das Zeichenverzeichnis ein).

jetzt was!

  • definieren einen Empfänger im manifesten für jedes Widget. (Genau wie das Beispiel in der Hauptantwort)

  • Sie können das gleiche Layout oder andere Layout verwenden. Grundsätzlich liegt das an dir.

  • in Ihrem Provider sollten Sie etwas wie dieses:

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

sicher machen, für jeden Anbieter die Ziellayoutdatei, die Sie verwenden möchten, angeben. In diesem Code frage ich nach der Datei main.xml im Layout-Verzeichnis.Ich werde eine anderen Anbieter mit dem gleichen genauen Code für meinen Medium-Widget zum Beispiel, aber ich werde die letzte Zeile

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

ich ändern hoffe, das hilft, wenn nicht lassen Sie mich wissen und ich kann ein funktionierendes Beispiel auf meinem laden Website und Sie können es genauer betrachten. Bitte lassen Sie mich wissen, wie es geht.

viel Glück.

26

Eigentlich Android: Name für jedes Widget muss anders sein. Wenn Sie dies wie in Beispiel tun, wird nur ein Widget in der Widget-Liste sichtbar sein.

+0

wie @jblz antwort (zu klären) –

+0

Ja !! Das ist das Problem!! Ich habe am Ende eine andere Widget-Provider-Klasse erstellt, die nur die erste erweitert, und dann im Manifest diese beiden Klassen für beide Widgets festlegen. –

11

Jungs, ich hatte das gleiche Problem.

Sie müssen auch einen zweiten Widget-Provider hinzufügen;

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

Genießen

+1

Wir benötigen eine separate Java-Klassendatei für das zweite Widget? – Si8

1

einige zusätzliche Informationen zu den anderen Antworten ...

  • Wenn Sie die Dateien erwähnt duplizieren, und wenn Ihr Widget ein Service nutzt einige Funktionen zur Verfügung zu stellen, Sie Möglicherweise müssen Sie Ihren Dienst duplizieren.

  • Wenn Sie duplizieren Sie Ihre Service, erinnern Manifest mit dem neuen Dienst zu aktualisieren, sonst wird der neue Dienst wird nicht ausgeführt ...

Dies verschwendet für mich einige Zeit.


Wenn Sie jeden BroadcastReceiverIntent s Ihre doppelten Service s senden ... vergessen Sie nicht zu, dass Code zu aktualisieren:

  • Sie müssen nun Absichten zu senden jeden von Die Dienste.