Cómo agregar widgets múltiples en una aplicación?
Acabo de terminar mi widget de Android. Ahora necesito tener diversos tamaños de este wiget para que el usuario elija de. Por ejemplo, necesito un widget de tamaño medio, pequeño y grande. Así que cuando el usuario instale la aplicación y mantenga presionada la pantalla de inicio a continuación, elija widget, en el menú de widgets quiero que vea tres widget con el mismo nombre de la aplicación, pero con el tamaño. algo como esto:
HelloSmall helloMedium helloLarge
- Estilo de todas las vistas de texto (o vista personalizada) sin agregar el atributo de estilo a cada TextView
- Se produjo un error en la transacción del encuadernador al colocar un mapa de bits dinámicamente en un widget.
- Widget de Android que parece exactamente un icono de lanzador
- Picasso: cargar imágenes en widget listview
- Widget de control de energía mostrado durante un breve momento al actualizar mi propio widget a través de AppWidgetManager, ¿cuál es el problema?
Tengo el medio uno listo, pero ¿cómo puedo hacer el pequeño y el grande en la misma aplicación? Sabiendo que los tres tamaños contienen los mismos datos exactos y las acciones sólo el tamaño y el fondo son diferentes.
Gracias.
- ¿Cómo agregar un botón a las notificaciones en android?
- Hacer un bucle a través de todos los "widgets" / elementos de una actividad
- Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
- ¿Cómo llamar a un servicio remoto Android (IPC) desde un servicio Widget / local?
- ¿Hay alguna manera de poner un campo EditText / entrada en un widget homescreen?
- Cómo tener acceso a un elemento TextView en un BroadcastReceiver
- Widget de la aplicación Android con renderizado personalizado
- Widget de Android que no se actualiza - tiene una ID de widget incorrecta
Necesita una definición de receptor para cada tipo en su 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 le permitiría tener la misma clase AppWidgetProvider
para varios widgets, con diferentes nombres de widget y diferentes tamaños definidos en el <appwidget-provider>
XML.
Ahora, si necesita más diferencias en sus widgets que en el <appwidget-provider>
XML, crearía una clase de widget base que implementa todo el comportamiento común entre los diferentes tipos:
public abstract class MyBaseWidget extends AppWidgetProvider
Y entonces cada una de sus implementaciones concretas podría extender MyBaseWidget. Entonces en su archivo de manifiesto tendría una definición de 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>
En realidad, android: el nombre de cada widget tiene que ser diferente. Si lo hace como en el ejemplo, solo un widget estará visible en la lista de widgets.
Chicos, tuve el mismo problema.
Debe añadir un segundo proveedor de widgets además;
<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>
Disfrutar
Ok así que básicamente necesitará:
Archivo de diseño delante de cada widget. Ej: main_small.xml, main_medium.xml …
En el directorio xml, agregue un proveedor para cada widget. Ex: small_provider.xml, medium_provider.xml … y así sucesivamente (tenga en cuenta que si no tiene un directorio xml, agréguelo bajo el directorio dibujable).
¡ahora que!
-
Definir un receptor en el manifiesto para cada widget. (Al igual que el ejemplo en la respuesta principal)
-
Puede utilizar el mismo diseño o disposición deferente. Básicamente esto depende de usted.
-
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 cada proveedor especifique 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 mediano 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 cargar un ejemplo de trabajo en mi sitio web y se puede tomar un vistazo más de cerca. Por favor, hágamelo saber cómo va.
la mejor de las suertes.
Alguna información adicional a las otras respuestas …
-
Si está duplicando los archivos mencionados y si su widget utiliza un
Service
para proporcionar alguna funcionalidad, puede que tenga que duplicar su servicio. -
Si duplica su
Service
, recuerde actualizar su manifiesto con el nuevo servicio , de lo contrario el nuevo servicio no se ejecutará …
Esto desperdició algún tiempo para mí.
Si usa cualquier BroadcastReceiver
para enviar Intent
a su Service
duplicado … no olvide actualizar ese código también:
- Ahora debe enviar intenciones a cada uno de los servicios.