简体   繁体   中英

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 want to set the color of the text itself, use

remoteViews.setInt(R.id.tvAmountThisYear, "setTextColor",
                android.graphics.Color.RED);

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

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, eg, "green" and "red" that might indicate some state.

从Android 2.2开始,可以调用此方法,而不是之前。

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?

当你运行2.2模拟器时,模拟器会让它通过,所以我猜这个限制从2.2开始解除。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM