2012-05-11 3 views
1

У меня есть виджет для домашних скриптов, и я генерирую некоторые элементы внутри (у меня есть макет этого элемента) виджет и настройка некоторых слушателей на них. Это очень просто, как это:Слушатели для динамически созданных объектов

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); 
созданы

товаров, добавленного к виджету, он выглядит великолепно, НО слушатели не работают так, как я хочу - только первый слушатель для первой кнопки работ, другие Безразлично «т. Я полагаю, что это потому, что я регистрирую setOnClickPendingIntent для обеих кнопок с одинаковым идентификатором (R.id.singleLine), но самая большая проблема заключается в том, что я не могу установить идентификатор кнопки, когда ее внутреннее дистанционное представление ...

Есть ли способ делаете что-то подобное? Thx много

EDIT: Это мой элемент макета, я пытаюсь создать.

<?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> 

ответ

2

Проблема заключается в том, что действие должно быть различным для каждого намерения, если не менять его только взять первый (или последний, в зависимости от ваших флагов).

То, что я делал в подобных ситуациях, дают дополнительный уникальный идентификатор действия, такие как:

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 
} 

Кроме того, добавить в ожидании намерения объектов с одним и тем же идентификатором, вы должны перейти в самую глубокую область действия, чтобы вы могли заключить только один элемент с этим идентификатором. Таким образом, эти намерения должны быть добавлены следующим образом:

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

таким образом вы на сфере списка макета элемента

+0

хорошо, для меня это не работает - конечно, потому что установка Im onClickPendingIntent 2x для тот же идентификатор, что и вы можете видеть. Вопрос о том, как избежать этого ... Для получения дополнительной информации я обновил свой первый пост и добавил макет, который я пытаюсь сгенерировать (с id singleLine) – qkx

+0

Я знаю, что вы используете один и тот же идентификатор, но он должен быть другим. Если вы используете этот идентификатор, чтобы сделать некоторую логику в вашем классе ForexWidget, используйте вместо него действие action.startsWith (Constants.Action_PRESSED_ITEM). – htafoya

+0

Я понимаю u абсолютно, но это не главная проблема. Проблема в том, что я делаю это 'updateViews.setOnClickPendingIntent (R.id.singleLine, pendingIntent1)' и этот 'updateViews.setOnClickPendingIntent (R.id.singleLine, pendingIntent2)', поэтому на самом деле я регистрирую 2 onclick намерения для одного item 'R.id.singleLine' - также у меня есть 2 экземпляра. Но как правильно зарегистрировать его? Потому что что-то вроде этого 'updateViews.setOnClickPendingIntent (currentItem1.getLayoutId(), pendingIntent1)' и этот 'updateViews.setOnClickPendingIntent (currentItem2.getLayoutId(), pendingIntent2)', конечно, не работает. – qkx

 Смежные вопросы

  • Нет связанных вопросов^_^