开发者

Android AppWidget TextView: How to set background color at run time

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜