2017-02-21 24 views
1

Android上のAppwidgetに問題が発生しました。私はlistViewとButtonを持っていて、ウィジェットのアップデート期間は30分に設定されています。 ボタンをクリックしたときにlistViewを更新します。私はインターネット上でこの問題を調査しましたが、問題を解決する答えは見つかりませんでした。 私のコードでは、ウィジェットを更新するためにonReceived()メソッドで何を書いていますか?Android AppWidgetアップデートListView

マイコード:

public class WidgetProvider extends AppWidgetProvider { 

private static final String ACTION_UPDATE_CLICK = "click"; 

private Date date; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    final int N = appWidgetIds.length; 

    for (int i = 0; i < N; ++i) { 
     RemoteViews remoteViews = updateWidgetListView(context, 
       appWidgetIds[i]); 

     appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); 
     remoteViews.setOnClickPendingIntent(R.id.bMorgenWidget, 
       getPendingSelfIntent(context, 
         ACTION_UPDATE_CLICK)); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 


private PendingIntent getPendingSelfIntent(Context context, String action) { 
    Intent intent = new Intent(context, getClass()); 
    intent.setAction(action); 
    return PendingIntent.getBroadcast(context, 0, intent, 0); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 

    if (ACTION_UPDATE_CLICK.equals(intent.getAction())) { 

    } 
} 

private RemoteViews updateWidgetListView(Context context, int appWidgetId) { 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 

    Intent svcIntent = new Intent(context, WidgetService.class); 
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, 
      svcIntent); 
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); 
    return remoteViews; 
} 
} 

答えて

0

私は同じ問題に直面しました。私はウィジェット内でデータとUIを強制的に更新する方法を知りました。

私が見つけた解決策は、パブリック静的な内部サービスを使用することです:メソッド refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView);

/** 
* Update Big Widget Service 
*/ 
public static class WidgetBigUpdateService extends Service 
{ 
    public WidgetBigUpdateService() 
    { 
     super(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     Context context = getBaseContext(); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass())); 
     RemoteViews bigWidgetView = new RemoteViews(context.getPackageName(), R.layout.widget_big_layout); 
     refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

をウィジェットに属し、私のウィジェットのUIのアップデートに責任がある:

/** 
* Asks for Big Widget Updates 
* 
* @param context 
*/ 
private void widgetBigForceUpdate(Context context) 
{ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass())); 
    onUpdate(context, appWidgetManager, appWidgetIds); 
} 

ご覧のとおり、コンテキストがあるonUpdate()という関数を呼び出すと、appWidgetManagerとappWidgetIdが呼び出されます。このコードは100%働いており、私はあなたの特定の用途にそれを適応させることができることは間違いありません。

希望すると便利です。

関連する問題