2

何かが足りないと思いますが、ボタンとカウンターを備えたアプリウィジェットを取得しようとしています。ボタンをクリックするたびに、カウンターを1ずつ更新します。

WidgetProviderのonUpdate()関数を設定して、保留中のイベントをボタンに登録し、カウンターの数を増やすサービスを開始します。

Intent active = new Intent(context, CounterService.class);
active.setAction(CounterService.COUNT);
PendingIntent pending = PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.CountButton, pending);

ComponentName component = new ComponentName(context.getPackageName(), KickCounterWidgetProvider.class.getName());    
appWidgetManager.updateAppWidget(component, views);

次に、サービスのCounterService :: onStart()関数で、カウントを増やし(今のところ設定に保存されています)、現在のカウント値を示すテキストフィールドを更新してみます。

// ... bump the count here and store a string representation of it in currentCountString ...

RemoteViews remoteView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget);

remoteView.setTextViewText(R.id.CurrentKickCount, currentCountString);

// apply changes to widget
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName component = new ComponentName(getApplicationContext().getPackageName(), KickCounterWidgetProvider.class.getName());    
appWidgetManager.updateAppWidget(component, remoteView);

Logcatの賢明な使用は、これがすべて正常に機能し、文字列が正常であるように見えることを示していますが、何らかの理由でappWidgetManager.updateAppWidget()の呼び出しが何らかの理由でサイレントに失敗しているようです。

関連しているかどうかはわかりませんが、ウィジェットのインスタンスをホーム画面に初めて追加すると、ボタンも機能しません(つまり、プロバイダーのonUpdate()でupdateAppWidget()を呼び出すと失敗します)。ウィジェットの後続のインスタンスは、プロバイダーのupdateAppWidget()の呼び出しでは正常に機能しているように見えますが、サービスでは機能しません。

どんな助けでも大歓迎です。

4

2 に答える 2

6

差出人: http ://code.google.com/p/android/issues/detail?id = 8889

新しくワイプされた、または新しく作成されたAVDにウィジェットをインストールする場合、appWidgetManager.updateAppWidget呼び出しはそれぞれの
ウィジェットを更新しません。インテントは適切に受信され、呼び出しは通常どおり呼び出されますが、ウィジェットの更新は発生しません。

AVDを(デバイスにウィジェットのパッケージがインストールされているかどうかに関係なく)再起動すると、最初の新しく初期化されていない起動後に問題が発生しなくなります。

この問題は2.0と2.1に存在するようで、1.5、1.6、2.2では期待どおりに動作しています。

于 2010-11-17T21:58:19.247 に答える
0

あなたの一般的なアプローチは健全に見えますが、thisおそらくここでもうまくいきgetApplicationContext()ます。ただし、最後の完全な段落は、他の何かがうまくいかない可能性があることを示唆しています。これは、使用しているパターンの種類を示すやや複雑なサンプルプロジェクトです。この場合、カウンターをぶつけるのではなく、レストランをランダムに選択します。

于 2010-11-16T21:05:49.690 に答える