使用9 patch可拉伸图片动态更改AppWidget的背景

4
RemoteViews类中没有setBackground()方法,因此我使用了以下解决方法:
  1. 创建一个FrameLayout作为小部件的背景,并将其设置为ImageView
  2. 使用setImageViewResource()方法更改ImageView图像。
不幸的是,当涉及到9-patch可绘制对象时,这种方法不起作用。当一个ImageViewandroid:src属性指向9-patch对象时,它也不起作用。是否有任何方式可以使用9-patch可绘制对象来编程更改AppWidget的背景图片?谢谢提前。 编辑:在XML文件中将9-patch设置为初始背景:
<ImageView
    android:id="@+id/small_widget_layout_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_lime" />

当我使用`android:src="@drawable/background_lime"`时,它无法正确地拉伸图像,而这段代码能正常工作。以下是从`AppWidgetProvider`的`onUpdate`方法更改背景的代码:
views.setImageViewResource(R.id.small_widget_layout_bg,
                    R.drawable.backgroung_lime);

这并不会将图片作为9-patch进行拉伸。

“它不工作”是什么意思? - Reuben Scratton
你确定你的9-patch有效吗?即在正常的进程上下文中正确绘制。我相信我以前已经做过这个而没有问题... - Reuben Scratton
@ReubenScratton,是的,9-patch绝对有效。如果我在XML中将其设置为应用程序小部件的初始背景 - 它会完美地调整大小。 - Egor
@ReubenScratton,实际上,当我将它设置为android:src时,它也不起作用,但是当它被设置为android:background时,它可以正常工作。 - Egor
@Zortkun,好的,我会更新我的问题。 - Egor
显示剩余6条评论
2个回答

5

在上面的评论中已经诊断出了这个答案...

RemoteView 不允许访问 View.setBackground(),所以你的解决方法是使用 ImageViewandroid:src 属性,前提是将 android:scaleType 属性设置为 fitXY

ImageView 不会拉伸它的前景图像,除非你告诉它这样做。


4
如果您认为以下内容微不足道或与主题无关,请忽略,但是如果您正在处理小部件,则可以尝试以下操作:
- 为您的小部件声明不同的布局(xml)。 - 更改remoteView的源(layout.id),而不是尝试对所选布局进行更改。
据我所知,这是解决此类问题最常见的方法。但是,我也可以自己指出两个简单的问题:
- 如果您的小部件有n个不同的“状态”/“视图”,该怎么办? - 跟踪这些并行文件的更改很繁琐。
只要您的9-patch文件也是静态资源,那么n就可能很麻烦,但从理论上讲仍然可管理。
此方法可能对您也不是一个选择,因为它基本上是一种困难的方法。但是,这仍然是一种选择。
建议#2
您是否尝试过使用以下方法? public void setInt (int viewId, String methodName, int value)
remoteView.setInt(R.id.viewid, "setBackgroundResource", R.drawable.backgroung_lime);

来自另一个问题:更改 remoteView ImageView 的背景


这个问题涉及到应用小部件;主屏幕“插件”。remoteViews不是OP自己的类。 - Julian Fondren
是的,我猜是这样。我让它听起来像是一个自定义类了吗?因为那不是我的意图。我会进行编辑。 - Orkun
@Zortkun,你的建议确实值得+1个赞。它完美地解决了我的问题 :) - Prativa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接