widgets studio programacion para móviles mejores gratis descargar desarrollo curso aplicaciones android android-widget

studio - Haga clic en el botón evento para el widget de Android



programacion android pdf 2018 (4)

Aquí hay otra respuesta con los siguientes beneficios:

  • Maneja todas las instancias de Widget de aplicación (un usuario puede tener varias instancias de su widget en varias configuraciones / tamaños en su pantalla). La codificación para todas las instancias es lo que prescribe la documentación oficial. Consulte Guía> Widgets de aplicación> Uso de la clase AppWidgetProvider , desplácese hacia abajo al ejemplo de código para "ExampleAppWidgetProvider".
  • El código de caballo de batalla en onReceive in effect llama onUpdate (para reducir la duplicación de código).
  • El código en onUpdate(Context context) se generaliza para que pueda soltarse en cualquier subclase de AppWidgetProvider.

El código:

public class MyWidget extends AppWidgetProvider { private static final String ACTION_UPDATE_CLICK = "com.example.myapp.action.UPDATE_CLICK"; private static int mCount = 0; private static String getMessage() { return String.valueOf(mCount++); } private PendingIntent getPendingSelfIntent(Context context, String action) { // An explicit intent directed at the current class (the "self"). Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); String message = getMessage(); // Loop for every App Widget instance that belongs to this provider. // Noting, that is, a user might have multiple instances of the same // widget on // their home screen. for (int appWidgetID : appWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.my_widget); remoteViews.setTextViewText(R.id.textView_output, message); remoteViews.setOnClickPendingIntent(R.id.button_update, getPendingSelfIntent(context, ACTION_UPDATE_CLICK) ); appWidgetManager.updateAppWidget(appWidgetID, remoteViews); } } /** * A general technique for calling the onUpdate method, * requiring only the context parameter. * * @author John Bentley, based on Android-er code. * @see <a href="http://android-er.blogspot.com * .au/2010/10/update-widget-in-onreceive-method.html"> * Android-er > 2010-10-19 > Update Widget in onReceive() method</a> */ private void onUpdate(Context context) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance (context); // Uses getClass().getName() rather than MyWidget.class.getName() for // portability into any App Widget Provider Class ComponentName thisAppWidgetComponentName = new ComponentName(context.getPackageName(),getClass().getName() ); int[] appWidgetIds = appWidgetManager.getAppWidgetIds( thisAppWidgetComponentName); onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (ACTION_UPDATE_CLICK.equals(intent.getAction())) { onUpdate(context); } } }

El widget se ve así

Esto se basa en el trabajo getPendingSelfIntent de @Kels, @SharonHaimPour y @ Erti-ChrisEelmaa.

También se basa en Android-er> 2010-10-19> Actualizar widget en el método onReceive () (no en mí) donde se muestra cómo invocar onUpdate desde onReceive, en una instancia de aplicación de widgets. Hago ese código general y lo callOnUpdate en callOnUpdate .

Tengo un widget de Android que obtiene datos de un servidor cada 10 minutos y los muestra en la pantalla.
Me gustaría agregar un botón "Refrescar" a ese widget.
Cuando el usuario hace clic en ese botón, me gustaría ejecutar el método que obtiene la información del servidor.
Agregar un controlador de eventos a un botón en una aplicación es muy fácil, sin embargo, no pude encontrar un ejemplo para un widget.
Me gustaría obtener ayuda para agregar una función a un botón y hacer clic en un widget.


Aquí hay un ejemplo más que debería ayudar:

package com.automatic.widget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class Widget extends AppWidgetProvider { private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { RemoteViews remoteViews; ComponentName watchWidget; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); watchWidget = new ComponentName(context, Widget.class); remoteViews.setOnClickPendingIntent(R.id.sync_button, getPendingSelfIntent(context, SYNC_CLICKED)); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); if (SYNC_CLICKED.equals(intent.getAction())) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews; ComponentName watchWidget; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); watchWidget = new ComponentName(context, Widget.class); remoteViews.setTextViewText(R.id.sync_button, "TESTING"); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } } protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } }


Descubrí cómo hacer eso.
Agregue una acción al archivo AndroidManifest.xml en la etiqueta> <receiver><intent-filter> :

<action android:name="MY_PACKAGE_NAME.WIDGET_BUTTON" />

En el proveedor, agregue una constante que coincida con el nombre de la acción:

public static String WIDGET_BUTTON = "MY_PACKAGE_NAME.WIDGET_BUTTON";

En el método onUpdate() , agregue un intento pendiente que coincida con la acción:

Intent intent = new Intent(WIDGET_BUTTON); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.MY_BUTTON_ID, pendingIntent );

Finalmente, en el método onRecieve (), verifique el nombre de la acción:

if (WIDGET_BUTTON.equals(intent.getAction())) { //your code here }


protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } views.setOnClickPendingIntent(R.id.Timm, getPendingSelfIntent(context, "ham"));

También prefiere URL:

Cómo manejar correctamente los eventos click en Widget

Si lo resolvió de una manera diferente, proporcione esto como respuesta