I am trying to create 开发者_运维问答an AppWidget, in which the background color of a TextView changes at random at specified periodic interval.
The TextView is defined in layout xml file as
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/message"
android:background="#ff99ff"
android:text="Hello Widget" />
</LinearLayout>
In update method, i have loaded the layout as
RemoteViews remoteView=new RemoteViews(context.getPackageName(),R.layout.widget_message);
To change the background of TextView i used the following statement
remoteView.setInt(R.id.message, "setBackgroundResource", R.color.col_1);
But i am getting a widget saying problem loading widget. If i remove the above line everything works fine.
LogCat says:
updateAppWidget couldn't find any view, using error view
android.widget.RemoteViews$ActionException: view: android.widget.TextView can't use method with RemoteViews: setBackgroundResource(int)
Try this it will work fine.
remoteView.setInt(R.id.message, "setBackgroundColor",
android.graphics.Color.BLACK);
If you have some shape as the background of the textview, where the background is defined in some drawable resource, then you can use
remoteViews.setInt(R.id.change,"setBackgroundResource", R.drawable.my_drawable_new);
In above code statement, R.id.change is the TextView with some background resource and you have defined some resources (my_drawable and my drawable_new) in your drawable folder.
<TextView
android:id="@+id/change"
android:background="@drawable/my_drawable">
</TextView
If you want to set the color of the text itself, use
remoteViews.setInt(R.id.tvAmountThisYear, "setTextColor",
android.graphics.Color.RED);
contentView.setInt(R.id.tv_contactText, "setBackgroundColor", Color.parseColor(hexColor));
Tomas is correct. My solution is to make two views with the respective backgrounds and make one INVISIBLE and the other one VISIBLE. Of course this only works with a small number of backgrounds, e.g., "green" and "red" that might indicate some state.
As of android 2.2 this method can be called, not before.
The reason is that via RemoteViews you can call just limited amount of methods. In case that it is prohibited you get message like this.
Tom
What i find weird about this is that it works great on my nexus one ( 2.2 ), but not at all on an HTC Tattoo ( 1.6 ). I'm going to try and run some emulator tests and see if it's not just another case of HTC lazily implementing some underlying UI rendering code, which i already found with the Tattoo ( Layouts render differently than on stock Android 1.6 ).
What device were you testing this on?
The emulator will let this go through when you run a 2.2 emulator, so I guess the restriction is lifted as of 2.2.
精彩评论