0

我有一个使用集合的小部件。What I need is to pass an id, from the widget, to an activity in my app when one of the rows of the widget ListViewis selected.

出于某种原因,当我调试活动时,发送了错误的 ID。我已将其范围缩小到与该职位有关的内容。如果我在调试时将位置传递给我的活动,那是错误的位置这可能只是我对带有集合的小部件如何工作的误解,因为它是我的第一个。

小部件服务

public class WidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
    }
}

class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory  {

        private List<Integer> mIds = new ArrayList<Integer>();
        private Context mContext;
        private int mAppWidgetId;

        public StackRemoteViewsFactory(Context context, Intent intent) {
            mContext = context;
            mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        public void onCreate() {
        }

        public int getCount() {
            // TODO Auto-generated method stub
            return mIds.size();
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public RemoteViews getLoadingView() {
            // TODO Auto-generated method stub
            return null;
        }

        public RemoteViews getViewAt(int position) {
            RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
            final Intent mi = new Intent(mContext, MyActivity.class);
            final Bundle bun = new Bundle();
            bun.putInt("id", mIds.get(position));
            mi.putExtras(bun);

            final PendingIntent piMain = PendingIntent.getActivity(mContext, mAppWidgetId, mi, PendingIntent.FLAG_UPDATE_CURRENT);

            rv.setOnClickPendingIntent(R.id.widget_text, piMain);
            rv.setTextViewText(R.id.widget_text, mIds.get(position));

            return rv;
        }

        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 1;
        }

        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return true;
        }

        public void onDataSetChanged() {
            mIds = Utilities.GetIds();
        }

        public void onDestroy() {
            // TODO Auto-generated method stub

        }
}

我的活动

public class Activity extends SherlockFragmentActivity {

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.browser_pager);

        if (getIntent().getExtras() != null)
        {
            final Bundle extras = getIntent().getExtras();

            int id = extras.getInt("id"); //this id is wrong
        }
    }
}
4

1 回答 1

3
final PendingIntent piMain = PendingIntent.getActivity(mContext, mAppWidgetId, mi, PendingIntent.FLAG_UPDATE_CURRENT);

getActivity()不用mAppWidgetId作请求代码:小部件 ID 是小部件实例的常量。结果,该平台无法将新产品识别Intent“新产品”,并且将始终提供相同PendingIntent的产品。引用文档

...重要的是要知道两个 Intent 何时被认为是相同的,以便检索 PendingIntent。人们犯的一个常见错误是创建多个 PendingIntent 对象,其 Intent 仅在其“额外”内容上有所不同,期望每次都获得不同的 PendingIntent。这不会发生。Intent 中用于匹配的部分与Intent.filterEquals定义的部分相同。如果您使用两个根据 Intent.filterEquals 等效的 Intent 对象,那么您将获得相同的 PendingIntent 对象。

有两种典型的方法来处理这个问题。

如果您确实需要同时激活多个不同的 PendingIntent 对象(例如用作同时显示的两个通知),那么您将需要确保它们有所不同以将它们与不同的待定意图。这可能是 Intent.filterEquals 考虑的任何 Intent 属性,或提供给getActivity(Context, int, Intent, int)getActivities(Context, int, Intent[], int)getBroadcast(Context, int) 的不同请求代码整数, Intent, int)getService(Context, int, Intent, int)

因此,改为使用对每一行唯一的 ID:position是一个很好的候选者。

于 2013-10-17T04:48:16.290 回答