3

我有一个 appwidget 应用程序,希望用户能够创建可以在运行时应用的皮肤。我首选的解决方案是使用带有九个补丁 png 图像的 apk 文件,这些图像可以拉伸以适合 ImageView 的小部件,但是它开始看起来我可能不得不使用另一种打包技术(例如 zip 文件)。

我尝试过:使用 context.getResourcesForApplication(my.app).getResources... 将九个补丁资源作为 Drawable 导入,使用画布将它们转换为位图,并使用 setImageViewBitap 将位图设置为 RemoteView。这不起作用,因为我需要在转换期间指定结果视图 (myBitmap.setBounds(..,..)) 的大小,并且我的 appwidget 中的某些宽度/高度不固定。也许有一种方法可以获得我错过的高度等。

使用 setImageViewUri() 将资源直接导入 RemoteView 这不起作用,因为该函数似乎不再读取 android.resource:// Uri 的(我在 ImageView 源中四处寻找,它似乎只读取文件路径和内容:// 乌里的)

使用 setImageViewResource() 将资源直接导入 RemoteView 不起作用,因为从外部包检索的 id 显然不包含包引用。

我要避免的是对我所有的 appwidget 宽度和高度进行硬编码,或者使用单独的打包方案。

有没有人很好地实现了 appwidget 皮肤并想分享知识?或者,我的逻辑中可能存在一个可以指出的漏洞。

如果需要,我可以提供代码,尽管我现在没有任何代码。

4

2 回答 2

2

我找到了这个示例解决方案http://www.siroccosoftware.com/devblog/?p=10

图像视图

Uri path = Uri.parse("android.resource://PACKAGE_NAME/RESOURCE_ID");

views.setImageViewUri(ID, path); 

远程视图

RemoteViews views = new RemoteViews("PACKAGE_NAME", "LAYOUT_RESOURCE_ID");
于 2012-03-22T15:37:24.340 回答
1

在尝试解决此问题时,我遇到了 ImageView 的代码。

事实证明,如果 URI 不是“内容”URI,那么 ImageView 会尝试通过调用来打开它Drawable.createFromPath(mUri.toString()),这本质上是需要路径而不是 URI。

如果你去掉 URI 的“file:///”部分,它就可以正常工作。

因此,您可以按如下方式更新您的代码:

views.setImageViewUri(R.id.alarm, Uri.parse(f.getAbsolutePath()); 
于 2010-12-10T02:01:48.167 回答