この質問は、RemoteViews に関するものです。通常のアクティビティでは正常に機能しますが、ウィジェットでは機能しません。
私はids.xmlにそれを持っています:
<item type="layout" name="linear_layout_for_widget"></item>
私は WidgetProvider クラスにこれを持っています:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget4x1_layout);
LinearLayout linearLayoutForWidget = layout4x1Provider.createLinearLayoutForWidget(backgroundColor,
textColor, borderColor, borderWidth, false);
RemoteViews nestedView = new RemoteViews(context.getPackageName(), R.layout.linear_layout_for_widget);
remoteViews.removeAllViews(R.id.frame_layout_root);
remoteViews.addView(R.id.frame_layout_root, nestedView);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
Layout4x1Provider はヘルパー クラスであり、コードでレイアウト ツリーを構築します。構成アクティビティ (プレビューを表示するため) でこれと同等のことを行うと、正しく表示されます。
Layout4x1Provider layout4x1Provider = new Layout4x1Provider(this);
FrameLayout frameLayoutRoot = (FrameLayout) findViewById(R.id.frame_layout_root);
LinearLayout linearLayoutWidget = layout4x1Provider.createLinearLayoutForWidget(backgroundColor,
textColor, borderColor, borderWidth, true);
frameLayoutRoot.removeAllViews();
frameLayoutRoot.addView(linearLayoutWidget);
RemoteView としては、RemoteView クラスの addView() メソッドは ViewGroup クラスの addView() メソッドと同等であるとドキュメントに記載されていますが、機能しません。
コードがコンパイルされ、例外のみが Logcat にスローされます。
04-06 00:42:12.843: W/AppWidgetHostView(4671): updateAppWidget couldn't find any view, using error view
04-06 00:42:12.843: W/AppWidgetHostView(4671): android.content.res.Resources$NotFoundException: File from xml type layout resource ID #0x7f060003
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1916)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1871)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.Resources.getLayout(Resources.java:731)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.widget.RemoteViews.apply(RemoteViews.java:1303)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.widget.RemoteViews$ViewGroupAction.apply(RemoteViews.java:844)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.widget.RemoteViews.performApply(RemoteViews.java:1328)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.widget.RemoteViews.apply(RemoteViews.java:1305)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:218)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.appwidget.AppWidgetHost.createView(AppWidgetHost.java:218)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at org.adw.launcher.Launcher.realAddWidget(Launcher.java:4005)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at org.adw.launcher.Launcher.access$25(Launcher.java:3984)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at org.adw.launcher.Launcher$3.onClick(Launcher.java:1069)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.os.Looper.loop(Looper.java:130)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.app.ActivityThread.main(ActivityThread.java:3687)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at java.lang.reflect.Method.invokeNative(Native Method)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at java.lang.reflect.Method.invoke(Method.java:507)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at dalvik.system.NativeStart.main(Native Method)
04-06 00:42:12.843: W/AppWidgetHostView(4671): Caused by: java.io.FileNotFoundException:
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.AssetManager.openXmlAssetNative(Native Method)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:486)
04-06 00:42:12.843: W/AppWidgetHostView(4671): at android.content.res.Resources.loadXmlResourceParser(Resources.java:1898)
04-06 00:42:12.843: W/AppWidgetHostView(4671): ... 21 more
したがって、明らかにAndroidは対応するxmlファイルを探しています...だから、Androidにxmlファイルを探さないようにするにはどうすればよいですか。ids.xml でレイアウト リソースを宣言すると、Android が物理ファイルを探すのを防ぐことができるはずです。レイアウトを作成するコードには、次のものがあります。
linearLayoutForWidget.setId(R.layout.linear_layout_for_widget);
これがアクティビティとして機能するのに、ウィジェット/RemoteView では機能しないのはなぜですか? ウィジェットを表示する代わりに、「ウィジェットの読み込みに問題があります」と表示されます。余談ですが、リソース項目のタイプを「レイアウト」から「id」およびそれぞれに変更しました。コードでは、役に立たない。
オンザフライで構成可能な多くのウィジェットを見てきましたが、リソース ファイルの膨大なコレクションに基づいているとは思えないほどです。たとえば、ユーザーがカラー ピッカーで任意の baclgroundcolor を選択できるウィジェット。