2012-11-20 11 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); 
     } 
    } 
} 

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> 

レイアウト - 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:DBAdapter.javaから

<?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():

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

ウィジェットプロバイダの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.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を交換することを確認します。あなたが(例えばあなたの主な活動の方法またはいつでも[保存]ボタンをクリックするには)あなたのウィジェットを更新するたび

はその後、あなたはPendingIntentを呼び出す:速いanswereため

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

感謝。 Main.javaでは、インテントの "context" updateWidget = new Intent(context、WidgetProvider.class);空です。私は文脈をどのように設定すべきですか? – user1759708

+0

コンテキストに「コンテキストを変数に解決できません」とマークされています。 – user1759708

+1

あなたのアクティビティのコンテキストです。そこに 'getBaseContext()'や 'this'を使うことができます。 –