2012-11-20 37 views
6

我的小部件中的TextView在放置在主屏幕時正確設置了正確的信息。但是,當我更新主應用程序中的信息時,小部件仍顯示舊信息。安卓小部件中的TextView不會更新

清單:

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

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

佈局 - 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()從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; 
} 

任何人有什麼線索的失蹤在我的代碼?

回答

4

您需要在Widget提供程序XML中設置以毫秒爲單位的更新時間間隔。 Example code

<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類被簡單地稱爲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用你的小部件的佈局引用。

然後,每當你想更新你的widget(例如在您的主要活動,或當保存按鈕被點擊的方法),你調用一個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(); 
+0

感謝快速的answere。在Main.java中,Intent中的「context」updateWidget = new Intent(context,WidgetProvider.class);是空的。我應該怎樣設定背景? – user1759708

+0

上下文標記爲「上下文無法解析爲變量」。 – user1759708

+1

這是您的活動環境。你可以在那裏使用'getBaseContext()'或'this'。 –