0

I try to make a configuration Activity that updates a widget. I also want to make the widget clickable. I managed to update the widget but it won't let me click on it (nothing happend).

This is my code.

private void generate() {

    // Create an Intent to launch WidgetConfigurationActivity screen
    Intent intent = new Intent(context, ConfigureWidgetActivity.class);

    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);

    // This is needed to make this intent different from its previous intents
    intent.setData(Uri.parse("tel:/" + (int) System.currentTimeMillis()));

    // Creating a pending intent, which will be invoked when the user
    // clicks on the widget
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Getting an instance of WidgetManager
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

    // Instantiating the class RemoteViews with widget_layout
    RemoteViews views = new RemoteViews(getBaseContext().getPackageName(), R.layout.widget_layout);

    //  Attach an on-click listener to the widget
    views.setOnClickPendingIntent(R.id.widget, pendingIntent);

    // Tell the AppWidgetManager to perform an update on the app widget
     appWidgetManager.updateAppWidget(mAppWidgetId, views);

    //-----BROADCAST
    Intent refreshIntent = new Intent(this, WidgetProvider.class);
    refreshIntent.putExtra("parser", parser);
    sendBroadcast(refreshIntent);
    //-----
    
    // Return RESULT_OK from this activity
    Intent resultValue = new Intent();
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    setResult(RESULT_OK, resultValue);
    finish();
}

Now, if I put this piece of code in comment

Intent refreshIntent = new Intent(this, WidgetProvider.class);
refreshIntent.putExtra("parser", parser);
sendBroadcast(refreshIntent);

The widget is of course not updated but is clickable.

When I do

//----FIRST NOW
Intent refreshIntent = new Intent(this, WidgetProvider.class);
refreshIntent.putExtra("parser", parser);
sendBroadcast(refreshIntent);

//----THIS COME AFTER
//  Attach an on-click listener to the widget
views.setOnClickPendingIntent(R.id.widget, pendingIntent);

// Tell the AppWidgetManager to perform an update on the app widget
appWidgetManager.updateAppWidget(mAppWidgetId, views);    

Here is my AppWidgetProvider (in case)

public class WidgetProvider extends AppWidgetProvider {
/** https://stackoverflow.com/questions/17434898/sending-data-to-my-homescreen-widget */
@Override
public void onReceive(Context context, Intent intent) {

    Parser parser = (Parser) intent.getSerializableExtra("parser");

    final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ComponentName name = new ComponentName(context, WidgetProvider.class);
    int[] appWidgetId = AppWidgetManager.getInstance(context).getAppWidgetIds(name);
    final int N = appWidgetId.length;
    if (N < 1)
    {
        return ;
    }
    else {
        int id = appWidgetId[N-1];
        updateWidget(context, appWidgetManager, id , parser);
    }
}

static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId,
                         Parser parser){

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    if (parser != null) {
        views.setTextViewText(R.id.regio, parser.getRegio());
        views.setTextViewText(R.id.max, parser.getMax());
        views.setTextViewText(R.id.min, parser.getMin());
        views.setTextViewText(R.id.windf, parser.getWindf());
        views.setImageViewResource(R.id.wind, parser.getWind());
        views.setImageViewResource(R.id.first, parser.getFirst());
        views.setImageViewResource(R.id.second, parser.getSecond());
    }

    appWidgetManager.updateAppWidget(appWidgetId, views);
}
}

I think it's something stupid :)

Found something (same code as mine?) - How to update a widget on app start

Community
  • 1
  • 1
Kaymaz
  • 454
  • 8
  • 23

1 Answers1

0

Well, I solved my problem.

private void generate() {

    // Getting an instance of WidgetManager
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());

    WidgetProvider.updateWidget(context, appWidgetManager, mAppWidgetId, parser);

    // Return RESULT_OK from this activity
    Intent resultValue = new Intent();
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    setResult(RESULT_OK, resultValue);
    finish();
}

All the code for binding a click in the widget is in the Provider:

static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId,
                         Parser parser){
    Toast.makeText(context, "updateWidget", Toast.LENGTH_LONG).show();
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

    if (parser != null) {
        views.setTextViewText(R.id.regio, parser.getRegio());
        views.setTextViewText(R.id.max, parser.getMax());
        views.setTextViewText(R.id.min, parser.getMin());
        views.setTextViewText(R.id.windf, parser.getWindf());
        views.setImageViewResource(R.id.wind, parser.getWind());
        views.setImageViewResource(R.id.first, parser.getFirst());
        views.setImageViewResource(R.id.second, parser.getSecond());
    }

    // Create an Intent to launch WidgetConfigurationActivity screen
    Intent intent = new Intent(context, ConfigureWidgetActivity.class);

    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

    // This is needed to make this intent different from its previous intents
    intent.setData(Uri.parse("tel:/" + (int) System.currentTimeMillis()));

    // Creating a pending intent, which will be invoked when the user
    // clicks on the widget
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Getting an instance of WidgetManager
    appWidgetManager = AppWidgetManager.getInstance(context);

    //  Attach an on-click listener to the widget
    views.setOnClickPendingIntent(R.id.widget, pendingIntent);

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

This solved my problem. I don't know if it is the right way of doing this ;)

Kaymaz
  • 454
  • 8
  • 23