我对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'弹出窗口,这或者暗示我总是点击第一个,或者暗示错误的数据正在通过。
我看过这个地方的所有地方,但除了通用的“如何传递数据”类型的教程/问题之外,找不到任何其他信息。
答案 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)));