2016-08-16 2 views
0

Я создаю виджет для своего приложения. Я начал с примера со следующей страницы.Как добавить несколько экземпляров виджета и обновить их отдельно?

http://www.androidauthority.com/create-simple-android-widget-608975/

Этот код с этой страницы.

public class SimpleWidgetProvider extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    final int count = appWidgetIds.length; 

    for (int i = 0; i < count; i++) { 
     int widgetId = appWidgetIds[i]; 
     String number = String.format("%03d", (new Random().nextInt(900) + 100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.simple_widget); 
     remoteViews.setTextViewText(R.id.textView, number); 

     Intent intent = new Intent(context, SimpleWidgetProvider.class); 
     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

}

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

Чтобы отладить, я скопировал этот код напрямую, изменив только макет и виды, чтобы увидеть, будет ли он работать. Это не так; та же проблема первого виджета, который не обновляется, возникает при добавлении второго виджета. На странице, на которой я связан, показано видео, в котором виджеты работают. Что может быть неправильным?


Кроме того, страница говорит, что если вы измените

intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

в

intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 

только тогда виджет нажал на обновит. Если я сделаю это изменение, даже с помощью одного виджета, ничего не получится. Это моя конечная цель, но создание нескольких виджетов - это, наверное, первый шаг.

ответ

0

int[] appWidgetIds содержит только со второго виджета, когда второй виджет добавлен на рабочий стол.

Таким образом, после добавления второго виджета вы заменяете существующий PendingIntent от первого виджета с новым PendingIntent, который содержит только самые последние int widgetId (intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);), любой щелчок от любого виджета будет транслировать PendingIntent с только самые последние int widgetID в нем; а не весь список ваших int[] appWidgetIds.

Грязным решением было бы хранить каждый идентификатор виджетов в статическом поле int[] и переопределять public void onDeleted (Context context, int[] appWidgetIds), чтобы удалить их соответственно. Однако я рекомендую переосмыслить весь ваш подход. Для моего приложения, я хотел бы хранить каждую widgetId в статическом поле и транслировать свое собственное намерение быть получен переопределенным public void onReceive(Context context, Intent intent):

Intent intent = new Intent("com.yourcompany.yourapp.WIDGET_CLICKED"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent); 

@Override 
    public void onReceive(Context context, Intent intent) { 
     switch (intent.getAction()) { 
      case "com.yourcompany.yourapp.WIDGET_CLICKED": 
       //update your widgets 
       break; 
     } 
     super.onReceive(context, intent); 
    } 

И, конечно, в этом случае, вы должны объявить пользовательские трансляции в манифест:

<intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      <action android:name="com.yourcompany.yourapp.WIDGET_CLICKED" /> 
</intent-filter> 

Отдельное примечание, я хотел бы упомянуть несколько советов.

Сначала рассмотрим более простой итерации с использованием for блока:

for (int appWidgetId : appWidgetIds) { 
    //do stuff with appWidgetId here 
} 

Во-вторых, updateAppWidget вызов может принимать все appWidgetIds в параметре int[] appWidgetIds, так что вам не придется перебирать их, если обновление того же RemoteViews объект для всех из них:

appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

Наконец, не забудьте позвонить своим super «s на что-либо переопределять в AppWidgetProvider s

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

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