Los widgets son la versión micro de la aplicación que consta de alguna funcionalidad de la aplicación que se muestra solo en las pantallas de inicio o la pantalla de bloqueo . Por ejemplo, vemos Weather , Time , Google Search Bars en la pantalla de inicio y FaceLock , FingerprintLock en la pantalla de bloqueo, que son algunos de los widgets disponibles en el dispositivo. Los widgets vienen con la Aplicación cuando la instala o la descarga de la Web. En general, los teléfonos vienen con una configuración de fábrica, pero el usuario puede ajustar dichos elementos más adelante. En este artículo, demostramos cómo se puede implementar un widget básico para una aplicación de Android.
Pasos para crear un widget básico
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Lo estamos implementando para los lenguajes Java y Kotlin .
Paso 2: agregue el widget de la aplicación al proyecto
Haga clic derecho en la aplicación , mueva el cursor a nuevo , busque la opción » Widget » al final, selecciónela.
Especifique las propiedades requeridas para el widget, como min. ancho y alto , archivo de configuración e idioma preferido, etc., y continúe. Los archivos se generan automáticamente.
Paso 3: instalar y ejecutar el código
- Instale y ejecute el código en un dispositivo virtual Android (AVD) o en un dispositivo personal.
- Abra la sección de widgets del teléfono, busque un widget con el nombre de la aplicación, selecciónelo y llévelo a la pantalla de inicio.
- ¡Prueba a cambiar las dimensiones y listo!
Salida: ejecutar en el emulador
¿Qué archivos adicionales se generan en este proceso?
Durante este proceso de selección e implementación, se generan algunos archivos adicionales y también se realizan cambios menores en los archivos existentes. No se requiere programación para generar un widget básico y solo se requiere si se va a incrustar una aplicación dentro del widget, como se explica en las partes posteriores del artículo. Expliquemos ahora los archivos recién generados que los cambios hacen a los existentes, uno por uno.
1. NewAppWidget.kt
¿Dónde se genera?
Kotlin
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetProvider import android.content.Context import android.widget.RemoteViews // Implementation of App Widget functionality. class NewAppWidget : AppWidgetProvider() { override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { // There may be multiple widgets active, so update all of them for (appWidgetId in appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId) } } // Enter relevant functionality for // when the first widget is created override fun onEnabled(context: Context) { } // Enter relevant functionality for // when the last widget is disabled override fun onDisabled(context: Context) { } } internal fun updateAppWidget( context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int ) { val widgetText = context.getString(R.string.appwidget_text) // Construct the RemoteViews object val views = RemoteViews(context.packageName, R.layout.new_app_widget) views.setTextViewText(R.id.appwidget_text, widgetText) // Instruct the widget manager to update the widget appWidgetManager.updateAppWidget(appWidgetId, views) }
Java
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.widget.RemoteViews; // Implementation of App Widget functionality. class NewAppWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // There may be multiple // widgets active, so update // all of them for (int appWidgetId : appWidgetIds) {updateAppWidget(context, appWidgetManager, appWidgetId); } } // Enter relevant functionality for // when the first widget is created @Override public void onEnabled(Context context) { super.onEnabled(context); } // Enter relevant functionality for // when the last widget is disabled @Override public void onDisabled(Context context) { super.onDisabled(context); } private void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { String widgetText = context.getString(R.string.appwidget_text); // Construct the RemoteViews object RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget); views.setTextViewText(R.id.appwidget_text, widgetText); // Instruct the widget manager to update the widget appWidgetManager.updateAppWidget(appWidgetId, views); } }
2. nuevo_aplicación_widget.xml
¿Dónde se genera?
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#09C" android:padding="@dimen/widget_margin"> <TextView android:id="@+id/appwidget_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_margin="8dp" android:background="#09C" android:contentDescription="@string/appwidget_text" android:text="@string/appwidget_text" android:textColor="#ffffff" android:textSize="24sp" android:textStyle="bold|italic" /> </RelativeLayout>
3. dimensiones.xml
XML
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Refer to App Widget Documentation for margin information http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout --> <dimen name="widget_margin">8dp</dimen> </resources>
4. new_app_widget_info.xml
XML
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialKeyguardLayout="@layout/new_app_widget" android:initialLayout="@layout/new_app_widget" android:minWidth="40dp" android:minHeight="40dp" android:previewImage="@drawable/example_appwidget_preview" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="86400000" android:widgetCategory="home_screen"> </appwidget-provider>
5. Cambios realizados en el archivo AndroidManifest.xml
XML
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geeksforgeeks.widget_basic"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- Receiver Element is Added to link the widget files to the Application --> <receiver android:name=".NewAppWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/new_app_widget_info" /> </receiver> <!-- ----------------------------Until Here------------------------------------> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
¿Sigue siendo necesaria la programación? Si es así, ¿qué parte del código se debe cambiar? (A continuación)
Sí, la programación sigue siendo un requisito para crear widgets. Los cambios se realizan dentro de NewAppWidget.kt, que es una clase de Kotlin y su equivalente, el archivo new_app_widget.xml, que muestra el widget. Las funcionalidades se pueden declarar dentro de la función de actualización del widget de la aplicación para las operaciones de la aplicación y new_app_widget.xml para agregar varios elementos a la visualización del widget. Dado que ambos archivos están vinculados internamente, la modificación de uno de ellos genera cambios en el otro.
Con respecto a la implementación de múltiples Widgets
No hay restricciones sobre la cantidad de widgets que puede tener una aplicación; sin embargo, se recomienda tener la cantidad mínima de widgets posible, ya que los widgets son elementos que cambian dinámicamente. Hay devoluciones de llamada de actualización (consulte el archivo new_app_widget_info.xml), updatePeriodMillis es un parámetro al que la aplicación sigue actualizando el widget, lo que significa que el subproceso de la aplicación para actualizar el widget sigue ejecutándose en segundo plano, adquiriendo una parte de la RAM limitada.
Publicación traducida automáticamente
Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA