Дополнительные возможности виджета при клике не видны

У меня есть виджет с изображением. Я хочу, чтобы когда пользователь нажимал на изображение, запускалась активность. Эта активность получает дополнительные функции от намерения (строки, целые числа). Это почти работает, но когда виджет обновляется, получаются старые дополнения, а не новые, указанные в AppWidgetProvider. Как я могу решить эту проблему?

Заранее спасибо, Саймон

AppWidgetProvider:

package com.aquariumzoekenpro.android;

import java.io.InputStream;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import com.aquariumzoekenpro.android.VissenDB.Vis;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.widget.RemoteViews;

public class Widget extends AppWidgetProvider {
    public static final String PREFS_NAME = "Vissen";
    static SharedPreferences sharedPreferences;
    PendingIntent pendingintent;
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){       
//      final int N = appWidgetIds.length;

            sharedPreferences = context.getSharedPreferences(PREFS_NAME, 0);            
            int rbitem = sharedPreferences.getInt("RBitem", 0);
//          int appWidgetId = appWidgetIds[i];          

            ComponentName thisWidget = new ComponentName(context, Widget.class);            
            VissenDB db = new VissenDB();
            int maxlength = db.lijst.size();
            Random r = new Random();
            int random = r.nextInt(maxlength - 0);      
            Vis v = db.lijst.get(random);
            int imageresource = context.getResources().getIdentifier(v.afbeelding, "drawable", context.getPackageName());
            InputStream is = context.getResources().openRawResource(imageresource);
            Bitmap bm = BitmapFactory.decodeStream(is);         
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
            views.setImageViewBitmap(R.id.widget_imageview, bm);            

            Intent clickintent = new Intent(context, VissenBeschrijving.class);
            clickintent.putExtra("list", rbitem);
            String text = "";
            if (rbitem == 0){
                text = v.naam;
            }else{
                text = v.latijnseNaam;
            }
            clickintent.putExtra("selected", text);
            clickintent.putExtra("Herkomst", "Encyclo");
            clickintent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);          
            pendingintent = PendingIntent.getActivity(context, 1, clickintent, 0);
            views.setOnClickPendingIntent(R.id.widget_imageview, pendingintent);
            appWidgetManager.updateAppWidget(thisWidget, views);




    }
    public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

        int width = bm.getWidth();      
        int height = bm.getHeight();        
        float scaleWidth = ((float) newWidth) / width;      
        float scaleHeight = ((float) newHeight) / height;       
        // CREATE A MATRIX FOR THE MANIPULATION     
        Matrix matrix = new Matrix();       
        // RESIZE THE BIT MAP       
        matrix.postScale(scaleWidth, scaleHeight);      
        // RECREATE THE NEW BITMAP      
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);     
        return resizedBitmap;

     }

}

VissenBeschrijving (приемная деятельность):

    i = this.getIntent();       
    VissenDB db = new VissenDB();
    String h = i.getStringExtra("Herkomst");

    if (i != null && h !=null){
        text = i.getStringExtra("selected");
        RBitem = i.getIntExtra("list", -1);
        if (RBitem == 0){
            //Nederlandse naam
            for (VissenDB.Vis v : db.lijst) {
                if (v.naam.equals(text)){
                    vis = v;
                    break;
                }
            }
        }
        else{
            //Latijnse naam
            for (VissenDB.Vis v : db.lijst) {
                if (v.latijnseNaam.equals(text)){
                    vis = v;
                    break;
                }
            }
        }
    }

person Simon    schedule 23.02.2013    source источник


Ответы (3)


Если я правильно помню, это потому, что он будет повторно использовать старое намерение, если ничего не изменилось в содержании.

Попробуйте добавить что-нибудь уникальное в цель клика. Например:

clickintent.setData(Uri.withAppendedPath(Uri.parse("myapp://widget/id/#togetituniqie" + appWidgetId), String.valueOf(appWidgetId)));

Предполагается, что вы знаете appWidgetId. В противном случае вы можете использовать что-то еще уникальное. Например, UUID.randomUUID().toString()

person Nicklas Gnejs Eriksson    schedule 23.02.2013
comment
Спасибо, это отлично работает! Вот что я добавил: clickintent.setData(Uri.withAppendedPath(Uri.parse("myapp://widget/id/#togetituniqie" + thisWidget), UUID.randomUUID().toString())); - person Simon; 23.02.2013
comment
Это помогло. В моем случае я добавил к намерению уникальное ДЕЙСТВИЕ, например: intent.setAction("SOME_PREFIX_" + appWidgetId) - person Yoraco Gonzales; 08.01.2017

Для меня это сработало, просто добавив FLAG_UPDATE_CURRENT к ожидающему намерению в поставщике виджетов.

Итак, в данном случае это будет:

pendingintent = PendingIntent.getActivity(context, 1, clickintent, PendingIntent.FLAG_UPDATE_CURRENT);

Таким образом, кажется, что старое ожидающее намерение, используемое для открытия действия, обновляется новым содержимым, отправленным от поставщика виджетов, включая внутреннее намерение.

person jmart    schedule 03.11.2014

У меня была та же проблема, и я решил просто добавить флаг PendingIntent.FLAG_ONE_SHOT (если вы хотите, чтобы намерение срабатывало один раз) или PendingIntent.FLAG_UPDATE_CURRENT (если вы хотите, чтобы оно выполнялось при каждом событии щелчка):

Intent intent = new Intent(context, YourWidgetProvider.class);
intent.setAction(ACTION_NAME);
intent.putExtra("extraName", extraValue);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
remoteViews.setOnClickPendingIntent(R.id.view_id, pendingIntent);
person RiccardoCh    schedule 24.08.2017