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

내 문제가 Action_widget_refresh에 해당하는 경우 onRecieve 방식의 텍스트 뷰가 업데이트되지 않는다는 것입니다. 텍스트보기에 보류중인 의도를 설정하여 텍스트보기 (R.id.content1)의 텍스트가 변경 될 때 변경되도록합니다. 하지만 텍스트보기를 클릭하면 텍스트보기가 사라집니다. 왜 이런 일이 일어나는지 모르겠습니다. 그 코드는 잘 작동합니다.

답변

0

당신이 appWidgetManager.updateAppWidget()를 호출 할 때마다, 당신은 필요에 전달하는 RemoveViews은 "위젯의 완전한 표현을 포함"할 수 있습니다. 즉, 텍스트가 변경 될 때가 아니라 매번 TextViews의 텍스트를 설정해야합니다. 변경되는 텍스트 만 설정하면 동일하게 유지할 텍스트가 손실됩니다.

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); 
    } 
} 
관련 문제