根据单击的textview将数据从app小部件传递到活动

时间:2011-01-28 10:21:00

标签: android android-widget

我对Android编程感到很沮丧,很抱歉,如果这很简单的话。

我的应用小部件由几个动态添加的文本视图组成,每个文本视图都会根据单击的视图,使用不同的索引启动相同的活动。获取正确的索引是我目前遇到的问题。

以下是我用来创建小部件的代码:

public static String ListItemIndex = "com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex";

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int N = appWidgetIds.length;
    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];


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

        // Create several views that will contain the content
        for (int newviewindex = 1; newviewindex<5; newviewindex++) {
            // Create an Intent to launch WidgetActivity for when we're clicked on
            Intent intent = new Intent(context, WidgetActivity.class);
            Bundle bundle = new Bundle();

            bundle.putInt(com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex, newviewindex);
            intent.putExtras(bundle);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            RemoteViews SubItemView = new RemoteViews(context.getPackageName(), R.layout.scroll_widget_item_layout);
            SubItemView.setTextViewText(R.id.textbox1, "testing " + newviewindex);
            SubItemView.setOnClickPendingIntent(R.id.textbox1, pendingIntent);
            views.addView(R.id.items_container, SubItemView);
        }

        // Tell the AppWidgetManager to perform an update on the current App Widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

这是活动代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle = getIntent().getExtras();

    if(bundle != null) {
        int Index = bundle.getInt(com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex);
        Toast.makeText(this, Integer.toString(Index), Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(this, "Boo!", Toast.LENGTH_LONG).show();
    }

    setContentView(R.layout.main);
}

目前发生的事情是无论我点击哪一个我总是得到'1'弹出窗口,这或者暗示我总是点击第一个,或者暗示错误的数据正在通过。

我看过这个地方的所有地方,但除了通用的“如何传递数据”类型的教程/问题之外,找不到任何其他信息。

3 个答案:

答案 0 :(得分:1)

我认为你正在为PendingIntent中的'陷阱'而堕落 - 默认情况下它不会被清除。你需要给它一个标志来做到这一点。查看我的博文:http://javablogs.com/Jump.action?id=628173

答案 1 :(得分:1)

@ george-duckett的评论值得单独回答,因为它确实解决了我的问题。

  

我找到了解决问题的方法。似乎我对同一个动作有几个待定意图,它只会得到最新的一个,实际上忽略了以前的动作。解决方案是传递一个唯一的标识符作为“requestCode”。 PendingIntent.getActivity方法的参数。

我有类似的问题类似的代码。它还将额外内容置于意图中,之后创建了pendingIntent:

PendingIntent pendingIntent = PendingIntent.getBroadcast(
    context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent.FLAG_UPDATE_CURRENT代替0的使用情况良好并且得到了保证,广播收到了一个新的意图,我们可以获得正确的数据&#34;额外&#34;比如getIntExtra

0使用requestCode导致问题。只有在我将其更改为某个值(我的TextView元素之后的唯一值)之后,我才能为不同的触摸文本视图获取不同的数据。我的元素显示通知,因此notificationId非常适合:

int notificationId = reminder.notificationId /* specific to my application, 
                                             find something for yours! */;
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

答案 2 :(得分:0)

试试这个。将数据添加到意图

intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));