-1

この質問は、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 を選択できるウィジェット。

4

1 に答える 1

1

あなたがそれを言ったので:

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

そうは言っても、私はそれがほとんど常にそうだと思います。

ただし、コードからのsの変更/追加Viewは、XMLレイアウトの使用と相互に排他的ではありません。XMLレイアウトに最小限の量を入れるだけで、たぶん1つだけLinearLayoutです。次に、を使用して必要に応じて追加できますaddView

于 2012-04-06T00:55:02.797 に答える