1

這是我的程序的代碼 -主屏幕小部件文本視圖不更新

package com.nadeem.todos; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.widget.RemoteViews; 

public class todo_widget extends AppWidgetProvider { 
private SQLiteDatabase db; 
private TodoSQLiteHelper dbHelper; 
String[] widget_title = { "", "", "", "", "", "" }; 
String[] widget_content = { "", "", "", "", "", "" }; 
public static String ACTION_WIDGET_REFRESH = "ActionReceiverRefresh"; 
public static String ACTION_WIDGET_OPEN = "ActionReceiverOpen"; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    Intent intent = new Intent(context, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
      intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 
    views.setOnClickPendingIntent(R.id.contentw2, pendingIntent); 
    views.setOnClickPendingIntent(R.id.contentw3, pendingIntent); 
    Intent i1 = new Intent(context, todo_widget.class); 
    i1.setAction(ACTION_WIDGET_REFRESH); 

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i1, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    views.setOnClickPendingIntent(R.id.flip, pi); 
    views.setOnClickPendingIntent(R.id.contentw1, pi); 
    appWidgetManager.updateAppWidget(appWidgetIds, views); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    AppWidgetManager appWidgetManager = AppWidgetManager 
      .getInstance(context); 

    int[] ids = AppWidgetManager.getInstance(context).getAppWidgetIds(
      new ComponentName(context, todo_widget.class)); 
    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 
    if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) { 
     views.setTextViewText(R.id.titlew1, widget_title[3]); 
     views.setTextViewText(R.id.contentw1, widget_content[3]); 
     appWidgetManager.updateAppWidget(ids, views); 

    } else if (intent.getAction().equals(
      AppWidgetManager.ACTION_APPWIDGET_UPDATE)) { 
     dbHelper = new TodoSQLiteHelper(context); 
     db = dbHelper.getWritableDatabase(); 
     String[] tableColumns = new String[] { "_id", "title", "todo" }; 

     int j = 0; 

     Cursor cursor = db.query("todos", tableColumns, null, null, null, 
       null, null); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 

      if (j < 6) { 
       widget_title[j] = cursor.getString(1); 
       widget_content[j] = cursor.getString(2); 
      } 
      j++; 

      cursor.moveToNext(); 
     } 
     db.close(); 
     final int N = ids.length; 
     for (int i = 0; i < N; i++) { 
      int appWidgetId = ids[i]; 
      views.setTextViewText(R.id.titlew1, widget_title[0]); 
      views.setTextViewText(R.id.titlew2, widget_title[1]); 
      views.setTextViewText(R.id.titlew3, widget_title[2]); 
      views.setTextViewText(R.id.contentw1, widget_content[0]); 
      views.setTextViewText(R.id.contentw2, widget_content[1]); 
      views.setTextViewText(R.id.contentw3, widget_content[2]); 
      appWidgetManager.updateAppWidget(appWidgetId, views); 

     } 
    } 
    super.onReceive(context, intent); 
} 
    } 

我的問題是,在onRecieve法文本視圖時Action_widget_refresh是真的沒有更新。我在文本視圖上設置了一個待定的意圖,以便在單擊時文本視圖(R.id.content1)的文本發生更改。但是當我點擊文本視圖文本視圖消失。我不知道爲什麼會發生這種情況。除此之外,代碼工作正常。

回答

0

每次調用appWidgetManager.updateAppWidget()時候,你需要通過RemoveViews「遏制小部件的完整表示」。這意味着您需要每次都爲TextView設置文本,而不僅僅是文本應該更改。通過僅設置更改的文本,您將丟失要保持不變的文本。

0

我認爲你應該做的事情:

if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) { 
    views.setTextViewText(R.id.titlew1, widget_title[3]); 
    views.setTextViewText(R.id.contentw1, widget_content[3]); 
    final int N = ids.length; 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = ids[i]; 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
}