使用9补丁drawable动态更改AppWidget的背景

时间:2012-02-22 09:35:59

标签: android background-image drawable android-appwidget nine-patch

setBackground()类中没有RemoteViews方法,所以我使用了以下解决方法:

  1. 为我的应用小部件创建FrameLayout,并以ImageView作为背景视图。
  2. 使用ImageView方法更改了setImageViewResource()图片。
  3. 不幸的是,当谈到9-patch drawables时,这种方法不起作用。此外,当ImageView的{​​{1}}属性指向9补丁时,它也不起作用。有没有办法用9-patch drawable以编程方式更改android:src的背景图像?提前谢谢。

    修改 将9-patch设置为XML中的初始背景:

    AppWidget

    当我使用<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

    这不会将图像拉伸为9补丁。

2 个答案:

答案 0 :(得分:5)

这个答案在上述评论中被诊断出来......

RemoteView不允许访问View.setBackground(),因此使用android:src的{​​{1}}属性的解决方法很好,提供ImageView属性设置为 fitXY

除非你告诉它,否则

the android:scaleType不会拉伸它的前景图像。

答案 1 :(得分:4)

如果您发现这个微不足道或无关紧要,请忽略,但是您可以尝试(假设您正在处理小部件):

  • xml声明不同的布局(widget)。
  • 更改remoteView'的来源(layout.id),而不是尝试对所选布局进行更改。

AFAIK ,这是解决此类问题的最常用方法。对于我自己可以注意到的两件简单的事情,这不是完美的:

  • 如果您的小部件中有不同的“状态”/“视图”,您会怎么做?

但是只要你的9补丁文件也是静态资源, n 很痛苦,但理论上仍然可以管理。

  • 跟踪这些并行文件中的更改非常繁琐。

我也很想为这个找到一个简单的方法......

这种方法对你来说也许不是一个选择,因为它基本上是艰难的方式。但它仍然是一个选择。


建议#2

您是否尝试过使用该方法?

public void setInt (int viewId, String methodName, int value)

remoteView.setInt(R.id.viewid, "setBackgroundResource", R.drawable.backgroung_lime);

来自另一个问题:Change remoteView ImageView background