TextView в виджетах Android не обновляется

TextView в моем виджетах правильно настроен с правильной информацией, когда он помещается на главный экран. Но когда я обновляю информацию в главном приложении, виджет все еще показывает старую информацию.

Manifest:

<receiver android:name=".WidgetProvider" android:label="@string/app_name" android:exported="false"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" /> </receiver> 

WidgetProvider.java:

 package com.example.huskeliste; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class WidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final int N = appWidgetIds.length; for (int i = 0; i < N; i++) { int widgetId = appWidgetIds[i]; DBAdapter info = new DBAdapter(context); info.open(); String data = info.getTextViewData(); info.close(); Intent intent = new Intent(context, Main.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); views.setOnClickPendingIntent(R.id.loWidget, pendingIntent); views.setTextViewText(R.id.txtView, data); appWidgetManager.updateAppWidget(widgetId, views); } } } 

Res – widget.xml:

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="1800000"> </appwidget-provider> 

Layout – widget.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loWidget" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:layout_margin="1dp" android:background="@drawable/background"> <TextView android:id="@+id/txtView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22dp" android:textColor="#ffffff" android:text="" /> </LinearLayout> 1 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loWidget" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:layout_margin="1dp" android:background="@drawable/background"> <TextView android:id="@+id/txtView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22dp" android:textColor="#ffffff" android:text="" /> </LinearLayout> 

background.xml:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#CC111111" android:endColor="#CC111111" android:angle="0" /> <padding android:left="4dp" android:top="1dp" android:right="4dp" android:bottom="1dp" /> <corners android:radius="3dp" /> </shape> 

GetTextViewData () из DBAdapter.java:

 public String getTextViewData() { String[] columns = new String[] { KEY_NAME }; Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); String result = ""; for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { if (result.length() > 0) { result += ", "; } result += c.getString(0); } return result; } 

Кто-нибудь знает, чего не хватает в моем коде?

Вы должны установить интервал обновления в миллисекундах внутри вашего XML-провайдера Widget. Пример кода :

 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:previewImage="@drawable/preview" android:initialLayout="@layout/example_appwidget" android:configure="com.example.android.ExampleAppWidgetConfigure" android:resizeMode="horizontal|vertical" android:widgetCategory="home_screen|keyguard" android:initialKeyguardLayout="@layout/example_keyguard"> </appwidget-provider> 

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

В этом примере класс Widget просто называется Widget.class:

 public class Widget extends AppWidgetProvider { // TODO: Don't forget to override the onUpdate method also @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("update_widget")) { // Manual or automatic widget update started RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); // Update text, images, whatever - here remoteViews.setTextViewText(R.id.yourTextID, "My updated text"); // Trigger widget layout update AppWidgetManager.getInstance(context).updateAppWidget( new ComponentName(context, Widget.class), remoteViews); } } } 

Обязательно замените макет и TextView ссылками на макет виджетов.

Затем, когда вы хотите обновить виджет (например, в методе onPause вашего основного действия или всякий раз, когда нажата кнопка «Сохранить»), вы вызываете PendingIntent :

 Intent updateWidget = new Intent(context, Widget.class); // Widget.class is your widget class updateWidget.setAction("update_widget"); PendingIntent pending = PendingIntent.getBroadcast(context, 0, updateWidget, PendingIntent.FLAG_CANCEL_CURRENT); pending.send(); 
Intereting Posts