そのため、AppWidgetProviderクラスのonUpdateメソッドで、新しいRemoteViewsオブジェクトを完全に再作成できるように、重要な量のコードを実行することになりました。現実には、更新するたびに、RemoteViewのテキストビューの1つにテキストを設定するだけで済みます。特定のウィジェットがすでに使用しているRemoteViewを変更するだけの方法はありますか?
-カーティス
そのため、AppWidgetProviderクラスのonUpdateメソッドで、新しいRemoteViewsオブジェクトを完全に再作成できるように、重要な量のコードを実行することになりました。現実には、更新するたびに、RemoteViewのテキストビューの1つにテキストを設定するだけで済みます。特定のウィジェットがすでに使用しているRemoteViewを変更するだけの方法はありますか?
-カーティス
まず、RemoteViewはビューではありません。これは、ビュー階層を構築する一連の命令です。別のプロセスでビューを再作成するために使用されます(アプリウィジェットはアプリのプロセスでは実行されません)。そのため、シリアル化および変更可能です。
したがって、RemoteViewを初期化するときは、RemoteViewへの参照をどこかに保存するだけです。たとえば、カスタムAppWidgetProviderのフィールドに保存します。次に必要になったときは、フィールドから取得して、何かを変更します。TextViewの文字列を変更するには、を使用しますsetString(..)
。
remoteView.setString(textViewId, "setText", "some text for TextView")
現在のAPIを使用している場合、これは2013年の更新です。更新を実行するWidgetProviderクラスのメソッド:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
rv = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
rv.setTextViewText(R.id.ofTextViewInWidgetLayoutXML, "Hello World");
appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv);
これは、remoteView.setStringではなく、remoteView.setTextViewTextであることに注意してください。
リモートビューを更新してから、
ComponentName componentName= new ComponentName(context, YourClass.class);
AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);
オン、どのAFAIKがウィジェットを更新する必要があるか