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

Swe*_*now 3 android android-widget android-listview remoteview android-pendingintent

我正在尝试通过使用该setOnClickFillInIntent方法使我的ListView Widget中的listrows可单击,但每当我单击ListItem时都没有发生任何事情.以下是我的代码的一些关键部分:

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);
Run Code Online (Sandbox Code Playgroud)

这是getView()我的ViewFactory 的结尾.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);
Run Code Online (Sandbox Code Playgroud)

有什么我想念的,或者你还有什么想知道的吗?

所有帮助表示赞赏!:)

Kar*_*uri 20

当你调用时setPendingIntentTemplate(...),id应该是AdapterView的(在这种情况下是ListView).当你打电话时setOnClickFillInIntent(...),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;
}
Run Code Online (Sandbox Code Playgroud)


tho*_*dao 6

如果您的应用面向 Android 12 及更高版本,您可能需要PendingIntent.FLAG_UPDATE_CURRENTPendingIntent.FLAG_UPDATE_CURRENT or 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)
Run Code Online (Sandbox Code Playgroud)