studio programacion para móviles libro edición desarrollo curso aplicaciones android android-intent android-widget

programacion - Android widget onclick listener para varios botones



programacion android pdf 2017 (3)

Estoy tratando de crear un widget para mi aplicación. Desde la lectura de un sitio de desarrolladores de Android, todos los oyentes de onclick deben tener un Intent. ¿Pero qué sucede si solo quiero que mi botón actualice los datos en el propio widget y no quiero comenzar una nueva actividad?

Aquí hay un código de demostración de Android:

Intent intent = new Intent(context, ExampleActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); // Get the layout for the App Widget and attach an on-click listener // to the button RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); views.setOnClickPendingIntent(R.id.button, pendingIntent);

Quiero un botón que, al hacer clic, realice una llamada web http y luego muestre los resultados en el widget. ¿Cómo hago para hacer esto si tengo que usar intenciones? También necesito poder diferenciar entre los botones donde se hizo clic.

¿Por qué los widgets usan intenciones y no el oyente normal de clics donde llama a una función como actividades?

EDITAR

Mi proveedor de widgets:

public class MyWidgetProvider extends AppWidgetProvider { private static final String MyOnClick1 = "myOnClickTag1"; private static final String MyOnClick2 = "myOnClickTag2"; private static final String MyOnClick3 = "myOnClickTag3"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // Get all ids ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int widgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm, getPendingSelfIntent(context, MyOnClick1)); remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm, getPendingSelfIntent(context, MyOnClick2)); remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm, getPendingSelfIntent(context, MyOnClick3)); remoteViews.setTextViewText(R.id.widget_textview_gpscoords, "gps cords"); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); } @Override public void onReceive(Context context, Intent intent) { if (MyOnClick1.equals(intent.getAction())) { // your onClick action is here Toast.makeText(context, "Button1", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button1"); } else if (MyOnClick2.equals(intent.getAction())) { Toast.makeText(context, "Button2", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button2"); } else if (MyOnClick3.equals(intent.getAction())) { Toast.makeText(context, "Button3", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button3"); } }; }

Mi manifiesto de Android:

<receiver android:name="widget.MyWidgetProvider" android:icon="@drawable/fsk" android:label="FSK Widget" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>


Aquí está el ejemplo:

public class SimpleWidgetProvider extends AppWidgetProvider { private static final String MY_BUTTTON_START = "myButtonStart"; RemoteViews remoteViews; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final int count = appWidgetIds.length; for (int i = 0; i < count; i++) { int widgetId = appWidgetIds[i]; remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); remoteViews.setTextViewText(R.id.textView, number); Intent intent = new Intent(context, SimpleWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.actionButton, getPendingSelfIntent(context, MY_BUTTTON_START)); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (MY_BUTTTON_START.equals(intent.getAction())){ Toast.makeText(context, "Click", Toast.LENGTH_SHORT).show(); } }; protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); }

}


Es posible hacer un evento onClick para Vistas en Widgets. Puede crear tantos eventos onClick como desee.

En la parte superior de su clase de Widget, cree una variable estática, que será su etiqueta de nombre onClick:

private static final String MyOnClick = "myOnClickTag";

Defina un método auxiliar para automatizar la creación de cada PendingIntent :

protected PendingIntent getPendingSelfIntent(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getBroadcast(context, 0, intent, 0); }

Establezca esta etiqueta onClick en su vista de la siguiente manera:

remoteViews.setOnClickPendingIntent(R.id.button, getPendingSelfIntent(context, MyOnClick));

cree un método onReceive en su clase de Widget y configure este evento onClick dentro de él:

public void onReceive(Context context, Intent intent) { if (MyOnClick.equals(intent.getAction())){ //your onClick action is here } };

Cada vez que se presiona la vista que establece la etiqueta, onReceive capturará eso y realizará la acción de la misma manera que nuestro evento onClick estándar de todos los días.

Editar: De acuerdo con su respuesta, ¿puede reemplazar su contenido de onUpdate con las siguientes líneas y volver a intentarlo?

RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_det); thisWidget = new ComponentName(context, MyWidgetProvider.class); remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm, getPendingSelfIntent(context, MyOnClick1)); remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm, getPendingSelfIntent(context, MyOnClick2)); remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm, getPendingSelfIntent(context, MyOnClick3)); remoteViews.setTextViewText(R.id.widget_textview_gpscoords, "gps cords"); appWidgetManager.updateAppWidget(thisWidget, remoteViews);


solo llama al super en tu método onReceive

@Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent);//add this line if (MyOnClick1.equals(intent.getAction())) { // your onClick action is here Toast.makeText(context, "Button1", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button1"); } else if (MyOnClick2.equals(intent.getAction())) { Toast.makeText(context, "Button2", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button2"); } else if (MyOnClick3.equals(intent.getAction())) { Toast.makeText(context, "Button3", Toast.LENGTH_SHORT).show(); Log.w("Widget", "Clicked button3"); } }