【问题标题】:Widgets: Distinguish between clicks on the views with the same id小部件:区分对具有相同 id 的视图的点击
【发布时间】:2012-02-12 20:46:15
【问题描述】:

我有一个简单的主屏幕小部件,它显示项目列表。由于我想支持旧设备,而不是 ListView,我使用了一系列“模拟”ListView 的 TextView 对象。

效果很好,但我想为这些项目分配一个点击监听器。在侦听器中,我想区分它们并根据项目的内容采取行动。

如何做到这一点?由于setOnClickPendingIntent 获取视图的 ID,我无法为单个项目分配单独的意图 - 它们都共享相同的 ID,因此处理程序不会知道哪个项目被点击。我只能从 XML 布局实例化 RemoteViews,所以我不能添加具有不同 ID 的项目(我需要创建很多布局文件,仅布局 ID 不同)。

由于 Honeycomb 有 setOnClickFillInIntent 方法以可接受的方式处理我的问题,但如果我想让我的小部件在 Gingerbread 上工作,我不能使用它。

【问题讨论】:

    标签: android android-intent homescreen


    【解决方案1】:

    我无法为单个项目分配单独的意图 - 它们都共享相同的 ID,因此处理程序不会知道哪个项目被点击。

    您的小部件必须具有唯一的 ID。

    我只能从 XML 布局中实例化 RemoteViews,所以我不能添加具有不同 ID 的项目

    当然可以。每个应用小部件大小都有一个布局文件(因此,如果您只支持一种大小,则可能只有一个布局文件周期)。在该布局文件中,您为小部件提供唯一 ID。

    【讨论】:

    • 目前,我有一个小部件的布局文件,其中一个空容器和另一个文件用于行布局。我在小部件更新期间使用 RemoteViews.addView(ID,RemoteViews) 将行插入到该容器中。根据我从您的回答中了解到的情况,您是否建议我应该在小部件 XML 中硬编码一些具有不同 ID 的行并停止使用 addView(然后为每个“行”设置 clickIntents)?
    • @user1234567:嗯,addView() 逻辑对你帮助不大。对于给定的应用程序小部件大小,您只能有这么多行。而且,您必须硬连线。而且,由于无论如何您都需要唯一的小部件 ID,您也可以手动将行 N 次克隆到您的主应用小部件布局中并提供唯一 ID。
    • 好吧,这甚至可以更快一些,因为每次更新我只会膨胀一次 XML,之后不会修改它的视图树(就像我以前使用 addView() 方法一样)。谢谢!
    【解决方案2】:

    你也许可以!我遇到了同样的问题,但后来我意识到我正在一次生成一个行(布局中的各个行,每一行来自同一个模板)。每一行都是它自己的 RemoteViews,所以在那个 for 循环中,我将意图设置在它自己身上。例如,如果我将新的 innerRemoteViews 添加到 outerRemoteViews,我会调用:

    innerRemoteViews.setOnClickPendingIntent(R.id.inner_row_template_id, PendingIntent.getActivity(context, 0, intent, 0));
    

    这样,Intent 被添加到 innerRemoteViews,其中 id 仍然特定于该行。

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2019-10-15
      相关资源
      最近更新 更多