7

コーディングしたウィジェットにちょっとした奇妙なバグがあります。画面が回転した後、ウィジェットが onClick イベントに応答しなくなります。コードは、アプリ ウィジェットの Android デベロッパー向けドキュメント (こちら) とまったく同じです。市場の他のウィジェットにはこの問題がないことに気付きました。おそらく既知の回避策はありますか? 回転後にあちこちをタップしようとしたので、回転後に onClickPendingIntent のサイズが変更されていないと思います。まったく存在しないようです。

ローテーションが発生した場合に AppWidgetProvider がリスニング コードをやり直すための onRotation() のようなトリガーが見つからないため、どうすればよいかわかりません...

ありがとう!

4

3 に答える 3

3

Google グループで作成した投稿から次の応答を受け取り、問題を解決しました。元のポスターの問題が解決するかどうかはわかりませんが、他の誰かがこの問題に遭遇した場合に備えて投稿します. Google グループの投稿へのリンクは次のとおりです。

http://groups.google.com/group/android-developers/browse_thread/thread/ca8c2958b6dc086c#


構成変更に関する onUpdate はありません。ホーム画面はウィジェットを再作成し、最新の RemoteView を取得してウィジェットに適用します。

ローテーションでウィジェットを再作成していると思いました。問題は、その旨のメッセージが表示されていないようで、接続を再確立する方法が (私が確認できるように) ないことです。ローテーションが発生したことを確認し、新しい onClick 接続を設定するにはどうすればよいですか?

私が言ったように、あなたはそうしません(向きの変化を決定または応答します)。

あなたがすることは、コードが RemoteViews オブジェクトをウィジェットのホーム アプリケーションにプッシュするたびに、すべての点で完全であることを確認することです。

  • 画像リソース ID を持っています。
  • テキスト文字列があります。
  • 保留中の意図があります。

通常のアクティビティで行うように、ウィジェットの「増分」更新を行わないでください。最初にインテントを設定し、次に画像を設定し、次に現在の情報を反映するテキストを設定しないでください。

ホーム アプリは別のプロセスとして実行され、その状態がウィジェット レシーバーとずれることがあります。その場合、ウィジェットを再作成するために持っている唯一のものは、最新の RemoteViews オブジェクトです。それが完全で、すべての部品が揃っていれば、すべてがうまく機能します。最新のテキストまたは画像の変更のみがある場合、インテントを持っていた以前の更新は失われます。

http://kmansoft.wordpress.com/2010/05/23/widgets-and-orientation-chan ...

-- コスチャ

于 2011-01-14T17:02:28.580 に答える
1

まず、呼び出している場合は、RemoteViews がウィジェットの状態を完全に表現していることを確認してくださいAppWidgetManager.updateAppWidget()。すべての保留中のインテントの設定、データの表示など。この状態は、ランチャーがウィジェットを状態から復元したいときに再利用されます。回転が変わるとき。

リモート ビューを更新したいが、完全な RemoteViews 表現を提供したくない場合。既存の remoteView 状態を変更したいだけの場合は、 を使用できますAppWidgetManager.partiallyUpdateAppWidget()

この更新は updateAppWidget(int, RemoteViews) とは異なり、渡された RemoteViews オブジェクトはウィジェットの不完全な表現であると認識されているため、AppWidgetService によってキャッシュされません。これらの更新はキャッシュされないため、appWidgetService でキャッシュされたバージョンを使用してウィジェットが復元された場合、restoreInstanceState によって復元されない、変更された状態は保持されないことに注意してください。RemoteViews.showNext(int)、RemoteViews.showPrevious(int)、RemoteViews.setScrollPosition(int, int) および同様のコマンドで使用します。

たとえば、onUpdate 以外のウィジェットの ViewPager を進める場合:

final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget_4x2);
remoteViews.showNext(R.id.appWidget_viewFlipper);
appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews);
于 2016-06-15T22:11:30.693 に答える
0

次のコードは、問題を解決できるようです。

@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
    onUpdate(context, appWidgetManager, new int[] {appWidgetId});
}
于 2014-10-27T23:36:07.703 に答える