Android:将对象从集合小部件传递到活动

Posted

技术标签:

【中文标题】Android:将对象从集合小部件传递到活动【英文标题】:Android: pass object from collection widget through to activity 【发布时间】:2013-05-22 21:47:43 【问题描述】:

我的应用程序有一个堆栈小部件,当单击小部件时,它当前只是启动主要活动。 我想更改此设置,以便为主要活动提供有关单击的小部件项的信息。 我想通过的对象实现 Parcelable 并且可以通过通知中的意图成功传递。但是,当绑定在小部件的意图中时,它似乎总是为空。

有什么想法吗?

StackWidgetProvider

     // set intent for item click (opens main activity)
        Intent viewIntent = new Intent(context, DealPadActivity.class);
        viewIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
        viewIntent.setData(Uri.parse(viewIntent.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent viewPendingIntent = PendingIntent.getActivity(context, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        rv.setPendingIntentTemplate(R.id.stack_view, viewPendingIntent);

StackWidgetService

public RemoteViews getViewAt(int position) 

    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.stack_widget_item);
    if (position < mWidgetItems.size())
        rv.setTextViewText(R.id.stack_widget_title, mWidgetItems.get(position).title);
        rv.setTextViewText(R.id.stack_widget_price, mWidgetItems.get(position).price);
        rv.setTextViewText(R.id.stack_widget_heat, mWidgetItems.get(position).heat);
        Bitmap picture = imageLaoder.getBitmap(mWidgetItems.get(position).imageUrl, true) ;
        rv.setImageViewBitmap(R.id.stack_widget_image, picture);
    

    Intent fillInIntent = new Intent();

    Bundle extras = new Bundle();
    extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
    extras.putParcelable("notificationDeal", new Deal(...));
    fillInIntent.putExtras(extras);

    rv.setOnClickFillInIntent(R.id.stack_widget_layout, fillInIntent);
    return rv;

MainActivity

    Bundle data = queryIntent.getExtras(); 

    if  (data!=null) // check to see if from widget or notification
    Deal deal = data.getParcelable("notificationDeal");
            if (deal!=null) // ****ALWAYS NULL FROM WIDGET**** 
                Log.d(this.getClass().getSimpleName(), "going to show passed deal");
                onDealSelected(deal);
            
            int i = data.getInt("com.bencallis.dealpad.stackwidget.EXTRA_ITEM");
            Log.d(this.getClass().getSimpleName(), "pressed widget is: " + i); **WIDGET ITEM POSITION AS EXPECTED **

** 更新**

这似乎是编组(特别是解组)的问题

E/Parcel: Class not found when unmarshalling: com.bencallis.abc.Deal, e: java.lang.ClassNotFoundException: com.bencallis.abc.Deal

我已将 Deal 类导入 StackWidgetService 并尝试设置类加载器,但这似乎没有帮助。

Deal 比喻已在应用的主要活动中成功使用,我只是在小部件上遇到了这个问题。

交易类别

public Deal(Parcel in) 
    in.readParcelable(Deal.class.getClassLoader());



@Override
public void writeToParcel(Parcel dest, int flags) 
    dest.writeString(title);
    ...


public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
    public Deal createFromParcel(Parcel in) 
        return new Deal(in);
    

    public Deal[] newArray(int size) 
        return new Deal[size];
    
;

【问题讨论】:

嗯...您接收的意图与您发送的意图相同吗?为什么不尝试为 Intent 设置一个动作,并确认接收到的 Intent 的动作是否是您发送时放置的动作?我认为您获得无效“交易”的唯一原因是您没有收到您期望收到的意图。 这似乎是解组的问题,因为找不到类。我试图设置类加载器,但我没有任何运气。请查看更新。 【参考方案1】:

您说您尝试设置类加载器。那应该行得通。我不确定您是如何尝试设置类加载器的,因为您没有提供该代码。试试这个:

MainActivity 中,插入:

ClassLoader loader = Deal.class.getClassLoader();
queryIntent.setExtrasClassLoader(loader);

在此之前:

Bundle data = queryIntent.getExtras();

【讨论】:

以上是关于Android:将对象从集合小部件传递到活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从主屏幕小部件传递给应用程序?

从 stackview 小部件传递可序列化对象会产生空指针异常

Android:使用 ListView 和 Service 从应用小部件开始活动

如何在颤动中将数据从一个小部件传递到另一个小部件?

如何从 android 主屏幕小部件启动活动

Android Widget:在将小部件添加到屏幕之前显示配置活动