Android小部件中的ListView onClick无法工作

6

我正在尝试使用setOnClickFillInIntent方法使我的ListView小部件中的列表行可点击,但是每当我单击一个列表项时,什么也不会发生。以下是我的代码的一些关键部分:

Intent i = new Intent();
Bundle extras = new Bundle();

extras.putInt(Resource.WIDGET_PACKAGE, position);
i.putExtras(extras);
row.setOnClickFillInIntent(R.id.widget_layout_parent, i);

这是在我的ViewFactory的getView()函数末尾。Resource.WIDGET_PACKAGE包含了我的包名,就像其他键一样。位置int是从getView()参数中获得的。R.id.widget_layout_parent是所有列表项中的父布局。
这是我WidgetProviders的onUpdate()函数末尾。
Intent clickIntent = new Intent(context, ItemListActivity.class);

PendingIntent clickPI = PendingIntent.getActivity(context, 0,
        clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);

widget.setPendingIntentTemplate(R.id.widget_layout_parent, clickPI);

appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i],
        R.id.widget_list_view);

我有所遗漏还是您还想了解其他内容?

非常感谢您的帮助!:)

3个回答

22

当您调用setPendingIntentTemplate(...)时,id应该是AdapterView的ID(在此示例中为ListView)。当您调用setOnClickFillInIntent(...)时,id应该是项布局的根视图的ID,如果我正确地阅读了您的原始帖子,那么这就是您已经在做的。

public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
    /* ... */
    widget.setPendingIntentTemplate(R.id.appwidget_listview, clickPI);
    /* ... */
}

public RemoteViews getViewAt(int position) {
    /* ... */
    row.setOnClickFillInIntent(R.id.widget_layout_parent, intent);
    /* ... */
    return row;
}

非常好的答案!经过数小时的研究,这正是我在寻找的确切答案。 - Kamran Ahmed
有没有人有Android小部件中ListView点击的完整代码示例?我按照https://laaptu.wordpress.com/2013/07/19/android-app-widget-with-listview/的示例,但是没有项目onclick。我尝试添加onclick但它不起作用。 :( - Mostafa Imran
@MostafaImran 这个问题在这里有详细的解释:https://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections。如果您有具体的问题,请开一个新的问题,并提供足够的代码和信息,以便我们能够帮助您。 - Karakuri

5

如果您的应用程序针对Android 12及以上版本进行定位,则可能需要从PendingIntent.FLAG_UPDATE_CURRENT更新为PendingIntent.FLAG_UPDATE_CURRENT或PendingIntent.FLAG_MUTABLE

请注意,FLAG_MUTABLE很重要,否则来自View Factory的填充意图将无法更新到挂起的意图模板中。

val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
  PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
} else {
  PendingIntent.FLAG_UPDATE_CURRENT
}
val clickPI = PendingIntent.getActivity(context, 0, clickIntent, flag)

4

以上回答来自@karakuri,非常完美。

必须同时使用 setPendingIntentTemplate 和 setOnClickFillInIntent。单独使用其中一个是不起作用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接