2010-04-03 25 views
60

Acabo de terminar mi widget de Android. Ahora necesito tener diferentes tamaños de este wiget para que el usuario pueda elegir. por ejemplo, necesito un widget de tamaño mediano, pequeño y grande. así que cuando el usuario instale la aplicación y mantenga presionada la pantalla de inicio y luego elija widget, en el menú del widget quiero que vea tres widgets con el mismo nombre de aplicación pero con el tamaño. algo como esto:cómo agregar múltiples widgets en una aplicación?

helloSmall helloMedium helloLarge

que tiene el medio una lista, pero ¿cómo puedo hacer que la pequeña y la grande en la misma aplicación? sabiendo que los tres tamaños contienen los mismos datos exactos y acciones, solo el tamaño y el fondo son diferentes.

Gracias.

Respuesta

96

Se necesita una definición receptor para cada tipo en el archivo de manifiesto como:

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

Esto permitirá tener la misma clase AppWidgetProvider ser utilizado para múltiples widgets, con diferentes nombres widget y diferentes tamaños definidos en el <appwidget-provider> XML.

Ahora bien, si usted necesita más diferencias en sus widgets que lo que está en el <appwidget-provider> XML crearía una clase widget de base que implementa toda la behavoir común entre los diferentes tipos:

public abstract class MyBaseWidget extends AppWidgetProvider 

Y entonces cada uno de sus implementaciones concretas podrían extender MyBaseWidget. Luego, en el archivo de manifiesto que tendría una definición receptor para cada una de sus implementaciones concretas como:

<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

¡Muchas gracias desde entonces! Yo estaba muy cerca. Voy a trabajar en ello y vuelvo eather con un mensaje de éxito o más preguntas. Muchas gracias. – BarcaDroid

+6

Hola, gracias por tu respuesta. Pero parece que no puedo compartir el mismo proveedor de widgets. (Si lo hago, solo se muestra primero en manifiesto). Entonces, básicamente, múltiples proveedores de widgets serían la respuesta para mí. ¿Alguien está trabajando con un proveedor de widgets? – xandy

+26

Sí, simplemente siguió las instrucciones anteriores y descubrió que solo funciona si especifico diferentes clases de proveedor de widgets. Bueno de todos modos, ¡gracias a todos! :) – dimsuz

5

Ok por lo que básicamente se necesita:

archivo de diseño plano cada widget. ej .: main_small.xml, main_medium.xml ...

en el directorio xml agregue un proveedor para cada widget. ej: small_provider.xml, medium_provider.xml ... y así sucesivamente (tenga en cuenta que si no tiene un directorio xml agréguelo en el directorio dibujable).

ahora qué!

  • definen un receptor en el manifiesto para cada widget. (al igual que en el ejemplo de la respuesta principal)

  • puede usar el mismo diseño o el mismo diseño. básicamente, esto depende de ti.

  • en su proveedor debe tener algo como esto:

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

Asegúrese de que, para cada proveedor para especificar el archivo de diseño de destino que desea utilizar. en este código, estoy pidiendo el archivo main.xml en el directorio de diseño.para mi widget de medio, por ejemplo, voy a tener otro proveedor con el mismo código exacto, pero voy a cambiar la última línea

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

Espero que esto ayude si no me deja saber y puedo subir un ejemplo de trabajo en mi sitio web y puedes echarle un vistazo más de cerca. Por favor déjame saber cómo va.

lo mejor de la suerte.

26

En realidad, Android: el nombre de cada widget debe ser diferente. Si va a hacer esto como en el ejemplo, solo un widget será visible en la lista de widgets.

+0

según @jblz respuesta (para aclarar) –

+0

¡Sí! ¡¡Este es el problema!! Terminé creando otra clase de proveedor de widgets que simplemente extiende el primero, y luego en el Manifiesto configura estas dos clases para ambos widgets. –

11

Chicos, tuve el mismo problema.

También necesita agregar un segundo proveedor 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> 

Disfrute

+1

¿Necesitamos un archivo de clase Java separado para el segundo widget también? – Si8

1

Alguna información adicional a las otras respuestas ...

  • Si está duplicando los archivos mencionados, y si tu widget utiliza un Service proporcionar alguna funcionalidad, podría tener que duplicar su servicio.

  • Si duplica su Service, Recuerde actualizar el manifiesto con el nuevo servicio, de lo contrario el nuevo servicio no funcionará ...

Esto desperdicia algo de tiempo para mí.


Si usa cualquier BroadcastReceiver para enviar Intent s a sus duplicados Service s ... no se olvide de actualizar ese código también:

  • ahora se debe enviar a los intentos cada uno de los servicios.
Cuestiones relacionadas