¿Cómo crear un widget básico de una aplicación de Android?

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.

Time Widget, Weather Widget, Google Search Bar Widget

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.

widget screenshot

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.

widget screenshot

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?

NewAppWidget

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *