Search code examples
javaandroidwidgetandroid-widgetreceiver

How to update widget views instantly when button clicked


I've seen a lot of answer here, none of them worked..! I just want a textview to get updated instantly once I click a button next to it.! I've tried to print a toast message and it shows normally, but updating views is the problem.

My Code

public class FollowersWidget extends AppWidgetProvider {

  public static String REFRESH_ACTION = "android.appwidget.action.APPWIDGET_UPDATE";

  int x = 0;

  @Override
  public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent); 

    if (intent.getAction().equals(REFRESH_ACTION)) {
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
      final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget);

      x++;
      views.setTextViewText(R.id.textv_count, x + "");

      int[] appWidgetId = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, FollowersWidget.class));
      appWidgetManager.updateAppWidget(appWidgetId, views); 
    }

  }

  static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
      int appWidgetId) {

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget);

    try {

      String count = MyConfigureActivity.getNumCount(context, appWidgetId);
      views.setTextViewText(R.id.textv_count, count );

      views.setOnClickPendingIntent(R.id.refreshButton,getRefreshPendingIntent(context, appWidgetId));

    } catch (Exception e) {
      e.printStackTrace();
    }

    appWidgetManager.updateAppWidget(appWidgetId, views);
  }

  public static PendingIntent getRefreshPendingIntent(Context context, int appWidgetId) {
    Intent intent = new Intent(REFRESH_ACTION);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  }

// other widget methods..
..
.
}

My Manifest

  <receiver android:name=".FollowersWidget">
      <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
      </intent-filter>

      <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/followers_info"/>
    </receiver>

Solution

  • I figured it out finally, I've seen a lot of ways to handle the onClick on widgets, but this way that worked out for me and it updates views intantally.

    Code

    public class TestWidget extends AppWidgetProvider {
    
      public static String REFRESH_ACTION = "android.appwidget.action.APPWIDGET_UPDATE";
      static private RemoteViews views;
      private int x = 0;
    
       @Override
        public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    
        if (intent.getAction().equalsIgnoreCase(REFRESH_ACTION)) {
          views = new RemoteViews(context.getPackageName(), R.layout.test_widget);
          AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
          int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, TestWidget.class));
          x++;
          views.setTextViewText(R.id.textv_count, x + "");
          appWidgetManager.updateAppWidget(appWidgetIds, views);
        }
      }
    
       static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
    
        views = new RemoteViews(context.getPackageName(), R.layout.test_widget); 
        views.setTextViewText(R.id.textv_count, x + "");
        views.setOnClickPendingIntent(R.id.button, getPenIntent(context));
        appWidgetManager.updateAppWidget(appWidgetId, views);
      }
    
    
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
         for (int appWidgetId : appWidgetIds) {
          appWidgetManager.updateAppWidget(appWidgetId, views);
        }
      }
    
        static private PendingIntent getPenIntent(Context context) {
        Intent intent = new Intent(context, TestWidget.class);
        intent.setAction(REFRESH_ACTION);
        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      }
    
    }