Search code examples
javaandroidwidgetandroid-widget

Handling multiple buttons inside a widget - Android


I have a widget that display a simple text and 3 buttons:

  • Refresh (Picks another random string and displays it)
  • Copy (Copy the contents of the textview to the clipboard)
  • Share (Share the content of the textview to social media and such)

I already Got the refresh button setup and working just fine but I can't seem to figure out a way to handle the other two buttons

PS. I don't need the actual code I already know how to do the copying and sharing I just need to know how to handle click events

Here is my code so far:

Button copy_content;
Button share_content;

void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
    /** Code below will be executed once the timer is over*/
    String widgetText = RandQuotes[rand.nextInt(RandQuotes.length)];

    // Construct the RemoteViews object
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.quotes_widget);
    views.setTextViewText(R.id.sayings, widgetText);



    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId, views);
}

@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);
    }
    final int count = appWidgetIds.length;

    for (int i = 0; i < count; i++) {
        int widgetId = appWidgetIds[i];
        String on_sayings = RandQuotes[rand.nextInt(RandQuotes.length)];

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.quotes_widget);
        remoteViews.setTextViewText(R.id.sayings, on_sayings);

        Intent intent = new Intent(context, HavamalWidget.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.switch_trigger, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }

}

Solution

  • Just make pending intents on buttons with action. So in onReceive() just check action of intent and make some logic on that. If you make some long tasks, better to make all logic in IntentService.

    Set pending intents on your buttons that are in RemoteViews like this:

    public static final String ACTION_BUTTON_SHARE = "ACTION_BUTTON_SHARE";
    public static final String ACTION_BUTTON_REFRESH = "ACTION_BUTTON_REFRESH";
    
    Intent refreshIntent = new Intent(context, ExampleAppWidget.class)
                .setAction(ACTION_BUTTON_REFRESH);
    PendingIntent refreshPI = PendingIntent.getBroadcast(context, 0, refreshIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setOnClickPendingIntent(R.id.refresh_button, refreshPI);
    
    Intent shareIntent = new Intent(context, ExampleAppWidget.class)
                .setAction(ACTION_BUTTON_SHARE);
    PendingIntent sharePI = PendingIntent.getBroadcast(context, 0, shareIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setOnClickPendingIntent(R.id.share_button, sharePI);
    

    In ExampleAppWidget.class (that extends from AppWidgetProvider) override OnReceive() method

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            if (intent.getAction().equals(ACTION_BUTTON_REFRESH)) {
               //make some logic here on button refresh
            } else if (intent.getAction().equals(ACTION_BUTTON_SHARE)) {
               //make some logic here on button share
            } else {
               super.onReceive(context, intent);
            }
        }
    }