Android AppWidget TextView: Cómo establecer el color de fondo en tiempo de ejecución

Estoy intentando crear un AppWidget, en el cual el color de fondo de un TextView cambia al azar en el intervalo periódico especificado.

El TextView se define en el archivo xml de diseño como

<?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> 

En el método de actualización, he cargado el diseño como

 RemoteViews remoteView=new RemoteViews(context.getPackageName(),R.layout.widget_message); 

Para cambiar el fondo de TextView i utilizó la siguiente declaración

 remoteView.setInt(R.id.message, "setBackgroundResource", R.color.col_1); 

Pero estoy recibiendo un widget diciendo widget de carga de problemas. Si quito la línea antedicha todo trabaja muy bien.

LogCat dice:

UpdateAppWidget no encontró ninguna vista, utilizando la vista de errores

Android.widget.RemoteViews $ ActionException: view: android.widget.TextView no puede usar el método con RemoteViews: setBackgroundResource (int)

Pruebe esto funcionará bien.

 remoteView.setInt(R.id.message, "setBackgroundColor", android.graphics.Color.BLACK); 

Si desea configurar el color del texto, utilice

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

Si tiene alguna forma como fondo de la vista de texto, donde se define el fondo en algún recurso dibujable, puede utilizar

 remoteViews.setInt(R.id.change,"setBackgroundResource", R.drawable.my_drawable_new); 

En la declaración de código anterior, R.id.change es el TextView con algún recurso de fondo y ha definido algunos recursos (my_drawable y mi drawable_new) en su carpeta dibujable.

 <TextView android:id="@+id/change" android:background="@drawable/my_drawable"> </TextView 

Tomas está en lo correcto. Mi solución es hacer dos vistas con los fondos respectivos y hacer uno INVISIBLE y el otro VISIBLE. Por supuesto, esto sólo funciona con un pequeño número de fondos, por ejemplo, "verde" y "rojo" que podría indicar algún estado.

A partir de Android 2.2 este método puede ser llamado, no antes.

ContentView.setInt (R.id.tv_contactText, "setBackgroundColor", Color.parseColor (hexColor));

La razón es que a través de RemoteViews puede llamar a cantidad limitada de métodos. En caso de que esté prohibido, obtendrá un mensaje como este.

Tom

Lo que me parece raro es que funciona muy bien en mi nexo uno (2.2), pero no en absoluto en un HTC Tattoo (1.6). Voy a tratar de ejecutar algunas pruebas de emulador y ver si no es sólo otro caso de HTC perezosamente la aplicación de algunos subyacentes UI renderización de código, que ya encontró con el tatuaje (Layouts de forma diferente que en la acción Android 1.6).

¿En qué dispositivo estaba probando esto?

El emulador dejará esto pasar cuando usted ejecuta un emulador 2.2, así que supongo que la restricción se levanta a partir de 2.2.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.