TextView in Android widgets not updating

The TextView in my widgets is correctly configured with the correct information when it is placed on the main screen. But when I update the information in the main application, the widget still shows the old information.

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> 

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 () from 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; } 

Does anyone know what is missing in my code?

+6
source share
1 answer

You need to set the update interval in milliseconds inside your Widget XML provider. Code example :

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

However, you should know that the system does not guarantee that the widget will be updated so often. In addition, if you want the widget to be updated more often (for example, after changing the configuration, as with your question), you need to do this manually. This is how I continue:

In this example, my Widget class is simply called 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); } } } 

Be sure to replace the layout and TextView links to the widget layout.

Then, when you want to update the widget (for example, in the onPause method of the main action or when you click the Save button), you call 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(); 
+4
source

All Articles