2

I'm trying to set up a widget containing two buttons. Clicking on the widget should raise the main activity. Clicking on one of the two buttons should do another actions.

I've tried following the steps described on Android widget button and Processing more than one button click at Android Widget but no dice. I don't know what I'm doing wrong.

The relevant part of my Manifest:

<receiver android:name="WidgetProvider" android:icon="@drawable/icon" android:label="Radio Podcastellano">
      <intent-filter>
          <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
          <action android:name="es.radiopodcastellano.player.WidgetProvider.ACTION_UPDATEINFO"/>
          <action android:name="es.radiopodcastellano.player.WidgetProvider.ACTION_REFRESH"/>
          <action android:name="es.radiopodcastellano.player.WidgetProvider.ACTION_PLAYPAUSE"/>
          <action android:name="es.radiopodcastellano.player.WidgetProvider.ACTION_SHOWMAIN" />
      </intent-filter>
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info" />
    </receiver>

Now, the WidgetProvider class itself:

public class WidgetProvider extends AppWidgetProvider {

public static String ACTION_PLAYPAUSE="ActionReveicerPlayPause";
public static String ACTION_UPDATEINFO="ActionReceiverUpdateInfo";
public static String ACTION_REFRESH="ActionReceiverRefresh";
public static String ACTION_SHOWMAIN="ActionShowMain";

@Override
public void onReceive(Context ctxt, Intent intent) {
    if (intent.getAction().equals(ACTION_REFRESH)) {
        Log.d("RPod_Widget", ACTION_REFRESH);
    } else if (intent.getAction().equals(ACTION_UPDATEINFO)) {
        Log.d("RPod_Widget", ACTION_UPDATEINFO);
    } else if (intent.getAction().equals(ACTION_PLAYPAUSE)) {
        Log.d("RPod_Widget", ACTION_PLAYPAUSE);
    } else if (intent.getAction().equals(ACTION_SHOWMAIN)) {
        Log.d("RPod_Widget", ACTION_SHOWMAIN);
    } else {
        Log.d("RPod_Widget", intent.getAction());
        super.onReceive(ctxt, intent);
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    Log.d("RPod_Widget","Action: onUpdate");

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

    Intent active = new Intent(context, MainActivity.class);
    active.setAction(ACTION_SHOWMAIN);
    PendingIntent actionPendingIntent = PendingIntent.getActivity(context, 234, active, 0);
    remoteViews.setOnClickPendingIntent(R.id.widgetLayout, actionPendingIntent);

    Intent active2 = new Intent(context, AppWidgetProvider.class);
    active2.setAction(ACTION_PLAYPAUSE);
    PendingIntent actionPendingIntent2 = PendingIntent.getBroadcast(context, 235, active2, 0);
    remoteViews.setOnClickPendingIntent(R.id.widgetPlayButton, actionPendingIntent2);

    Intent active3 = new Intent(context, AppWidgetProvider.class);
    active3.setAction(ACTION_UPDATEINFO);
    PendingIntent actionPendingIntent3 = PendingIntent.getBroadcast(context, 236, active3, 0);
    remoteViews.setOnClickPendingIntent(R.id.widgetReloadButton, actionPendingIntent3);

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);


}

}

The main activity gets raised when I click on the widget layout, but the buttons are completely ignored. I click on them but no effect. No messages from onReceive are being shown on Logcat, only this:

07-05 15:41:41.675: DEBUG/RPod_Widget(4144): Action: onUpdate
07-05 15:44:39.261: DEBUG/RPod_Widget(4198): android.appwidget.action.APPWIDGET_UPDATE
07-05 15:44:39.261: DEBUG/RPod_Widget(4198): Action: onUpdate
07-05 15:49:48.078: DEBUG/RPod_Widget(4285): android.appwidget.action.APPWIDGET_UPDATE
07-05 15:49:48.078: DEBUG/RPod_Widget(4285): Action: onUpdate

Some advice? Thank you!

Community
  • 1
  • 1
Jorge Suárez de Lis
  • 565
  • 1
  • 10
  • 29

2 Answers2

1

I found the problem. The code for one button:

Intent active2 = new Intent(context, AppWidgetProvider.class);
active2.setAction(ACTION_PLAYPAUSE);
PendingIntent actionPendingIntent2 = PendingIntent.getBroadcast(context, 235, active2, 0);
remoteViews.setOnClickPendingIntent(R.id.widgetPlayButton, actionPendingIntent2);

The problem is that I'm providing AppWidgetProvider.class as an argument for the Intent, and I should be providing WidgetProvider.class, that is my own implementation of an AppWidgetProvider (formerly, extends AppWidgetProvider). So, the corrected line:

Intent active2 = new Intent(context, WidgetProvider.class);

And that's all :)

Jorge Suárez de Lis
  • 565
  • 1
  • 10
  • 29
0

The Action in Manifest should be the same as what u passed in Intent

For example,

public static String ACTION_PLAYPAUSE="es.radiopodcastellano.player.WidgetProvider.ACTION_PLAYPAUSE";
Vivek Khandelwal
  • 7,829
  • 3
  • 25
  • 40
  • I tried changing all strings following your suggestion, but the problem remains. Also, your suggestion doesn't match at all the mentioned proposal at http://stackoverflow.com/questions/2471875/processing-more-than-one-button-click-at-android-widget . Thanks anyway. – Jorge Suárez de Lis Jul 05 '12 at 14:22