【问题标题】:Listeners for dynamically created items动态创建项目的监听器
【发布时间】:2012-05-20 05:53:04
【问题描述】:

我有家庭 scrren 小部件,我在小部件内部生成一些项目(我有这个项目的布局)并在它们上设置一些侦听器。很简单,就像这样:

RemoteViews currentItem1 = new RemoteViews(context.getPackageName(), R.layout.complex_list_item);
    updateViews.addView(R.id.panelNews, currentItem1);
    Intent intent1 = new Intent(context, ForexWidget.class);
    intent1.setAction(Constants.ACTION_PRESSED_ITEM);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, intent1, 0);
    updateViews.setOnClickPendingIntent(R.id.singleLine, pendingIntent1);

    RemoteViews currentItem2 = new RemoteViews(context.getPackageName(), R.layout.complex_list_item);
    updateViews.addView(R.id.panelNews, currentItem2);
    Intent intent2 = new Intent(context, ForexWidget.class);
    intent2.setAction(Constants.ACTION_PRESSED_ITEM);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, intent2, 0);
    updateViews.setOnClickPendingIntent(R.id.singleLine, pendingIntent2);

项目被创建,添加到小部件中,看起来很棒,但是监听器没有按我想要的方式工作 - 只有第一个按钮的第一个监听器工作,其他人没有。我想这是因为我为具有相同 id (R.id.singleLine) 的两个按钮注册了 setOnClickPendingIntent - 但最大的问题是,当它在远程视图中时,我无法设置按钮的 id...

有没有办法做这样的事情?非常感谢

编辑:这是我的布局项目,我正在尝试生成。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/singleLine"
    android:layout_width="fill_parent"
    android:layout_height="34dp"
    android:clickable="true"
    android:orientation="vertical" >

    <TextView
            android:id="@+id/txtTime"
            android:layout_width="45dp"
            android:layout_height="wrap_content"
            android:paddingRight="5dp"
            android:textSize="@dimen/fontNewsCompact" />

        <TextView
            android:id="@+id/txtCurrency"
            android:layout_width="30dp"
            android:layout_height="wrap_content"
            android:paddingRight="5dp"
            android:textSize="@dimen/fontNewsExtraCompact" />

</LinearLayout>

【问题讨论】:

    标签: android android-widget remoteview


    【解决方案1】:

    问题是每个意图的动作必须不同,如果你不改变它,它只会采取第一个(或最后一个,取决于你的标志)。

    我在类似情况下所做的是为操作提供一个额外的唯一标识符,例如:

    intent1.setAction(Constants.ACTION_PRESSED_ITEM + "-1");
    ...
    intent2.setAction(Constants.ACTION_PRESSED_ITEM + "-2");
    

    然后在您的 ForexWidget 类上使用以下内容:

    if (intent.getAction().startsWith(Constants.ACTION_PRESSED_ITEM) {
    
        // your logic here
    }
    

    此外,要向具有相同 Id 的对象添加待处理的意图,您应该进入尽可能深的范围,以便仅包含具有该 Id 的一个项目。这样,应按如下方式添加意图:

    currentItem1.setOnClickPendingIntent(R.id.singleLine, pendingIntent1)
    ...
    currentItem2.setOnClickPendingIntent(R.id.singleLine, pendingIntent2)
    

    这样你就在列表项布局的范围内

    【讨论】:

    • 好吧,对我来说它不起作用 - 当然,因为我将 onClickPendingIntent 2x 设置为与您看到的相同的 id。一天的问题是,如何避免这种情况......有关更多信息,我已经更新了我的第一篇文章并添加了我要生成的布局(id 为 singleLine)
    • 我知道您使用的是同一个 ID,但它必须不同。如果您使用该 Id 在 ForexWidget 类上创建一些逻辑,则使用 action.startsWith(Constants.Action_PRESSED_ITEM) 而不是等式。
    • 我完全理解你,但这不是主要问题。问题是,我正在做这个updateViews.setOnClickPendingIntent(R.id.singleLine, pendingIntent1) 和这个updateViews.setOnClickPendingIntent(R.id.singleLine, pendingIntent2) 所以实际上我正在为一项R.id.singleLine 注册2 个onclick 意图 - 我也有2 个实例。但是如何正确注册呢?因为像 updateViews.setOnClickPendingIntent(currentItem1.getLayoutId(), pendingIntent1)updateViews.setOnClickPendingIntent(currentItem2.getLayoutId(), pendingIntent2) 这样的东西当然不起作用..
    • 啊,好的。那么你可以做的是使用currentItem1.setOnClickPendingIntent(R.id.singleLine, pendingIntent1) 和这个currentItem2.setOnClickPendingIntent(R.id.singleLine, pendingIntent2),这样你就在你的列表项布局的范围内
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多