2012-04-18 146 views
1

我創建了一個應用程序小部件,它查詢數據庫中的數據,並在數據更改後使用內容觀察程序更新標籤。問題是,當創建小部件時,我將標籤更新爲正確的值。當數據發生變化時,內容觀察者正確地註冊了這一點,但我無法獲得小部件更新。代碼如下所示:Appwidgetmanager.updateAppwidget()沒有做任何事情

//called after the configuration activity is done 
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
     int appWidgetId){ 
    m_appWidgetManager = appWidgetManager; 
    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0); 
    m_account = prefs.getString("account" + appWidgetId, "unknown"); 
    m_label = prefs.getString("label" + appWidgetId, "unknown"); 
    m_context = context; 
    if (!m_accounts.contains(m_account)){ 
     m_accounts.add(m_account); 
     m_context.getContentResolver().registerContentObserver(GmailContract.Labels.getLabelsUri(m_account), true,new MyContentObserver(new Handler())); 
    } 
    updateViews(); 

} 

在ContentObserver,我只覆蓋了以下功能:

@Override 
public void onChange(boolean selfChange) { 
     GmailUnreadCounterActivity.updateViews(); 
     super.onChange(selfChange); 
    } 

的更新視圖功能看起來像這樣(從updateAppWidget調用時,它完美的作品,從調用時在contentobserver,小部件不更新,儘管價值變化)

public static void updateViews(){ 
    System.out.println("Number of widgets:" + m_appWidgetIds.length); 
    for (int i = 0; i < m_appWidgetIds.length; i++){ 
     SharedPreferences prefs = m_context.getSharedPreferences(PREFS_NAME, 0); 
     m_account = prefs.getString("account" + m_appWidgetIds[i], "unknown"); 
     m_label = prefs.getString("label" + m_appWidgetIds[i], "unknown"); 
     Cursor c = m_context.getContentResolver().query(GmailContract.Labels.getLabelsUri(m_account),null,null,null,null); 
     while (c.moveToNext()) { 
      if (c.getString(c.getColumnIndex(GmailContract.Labels.CANONICAL_NAME)).equals(m_label)){ 
       String line = String.valueOf(c.getInt(c.getColumnIndex(GmailContract.Labels.NUM_UNREAD_CONVERSATIONS))); 
       remoteViews = new RemoteViews(m_context.getPackageName(), R.layout.main); 
       remoteViews.setTextViewText(R.id.unread_count, 
         line); 
       AppWidgetManager.getInstance(m_context).updateAppWidget(m_appWidgetIds[i], remoteViews); 
      } 
     } 
    } 
} 

回答

0

你怎麼m_appWidgetIds?

爲什麼要保留它在for循環中並更新所有實例。而不是使用

updateAppWidget (ComponentName provider, RemoteViews views) 

這將更新小部件的所有實例。

使用以下代碼獲取ComponentName ComponentName provider = new ComponentName(context,YourAppWidgetProvider.class);

+0

你好,int [] appWidgetIds參數傳遞給onUpdate的目的是什麼? – 2012-10-21 21:06:34

+0

從android doc引用 - 「需要更新的appWidgetIds。請注意,這可能是該提供者的所有AppWidget實例,或者只是它們的一個子集」 – San 2012-10-22 23:27:50