2012-11-20 36 views
6

TextView trong widget của tôi được đặt đúng với thông tin chính xác khi nó được đặt ở màn hình chính. Nhưng khi tôi cập nhật thông tin trong ứng dụng chính, tiện ích vẫn hiển thị thông tin cũ.TextView trong widget android không cập nhật

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> 

bố trí - 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() từ 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; 
} 

Bất cứ ai cũng có một đầu mối những gì còn thiếu trong mã của tôi?

Trả lời

4

Bạn cần đặt khoảng thời gian cập nhật bằng mili giây bên trong XML của nhà cung cấp tiện ích con. 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> 

Tuy nhiên, bạn nên biết rằng hệ thống không đảm bảo tiện ích được cập nhật thường xuyên. Ngoài ra, nếu bạn muốn tiện ích con cập nhật thường xuyên hơn (ví dụ: sau khi thay đổi cấu hình, vì nó là với câu hỏi của bạn), bạn cần phải làm điều đó theo cách thủ công. Đây là cách tôi tiến hành:

Trong ví dụ này lớp Widget của tôi chỉ đơn giản là gọi 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); 
     } 
    } 

} 

Hãy chắc chắn rằng để thay thế bố trí và TextView với sự tham khảo để bố trí widget của bạn.

Sau đó, bất cứ khi nào bạn muốn cập nhật widget của bạn (ví dụ trong phương pháp hoạt động chính của bạn hoặc bất cứ khi nào một nút Save được nhấp), bạn gọi một 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

Cám ơn answere nhanh. Trong Main.java, "context" trong Intent updateWidget = new Intent (context, WidgetProvider.class); trống. Tôi nên đặt ngữ cảnh thành gì? – user1759708

+0

ngữ cảnh được đánh dấu bằng "ngữ cảnh không thể được giải quyết thành một biến". – user1759708

+1

Đó là bối cảnh Hoạt động của bạn. Bạn có thể sử dụng 'getBaseContext()' hoặc 'this' ở đó. –

Các vấn đề liên quan