2010-03-16 18 views
20

Estoy tratando de crear un AppWidget, en el que el color de fondo de un TextView cambia al azar en un intervalo periódico específico.Android AppWidget TextView: cómo establecer el color de fondo en tiempo de ejecución

La TextView se define en el archivo xml diseño que

<?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 la Vista de Texto i utiliza la siguiente declaración

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

Pero me aparece un widget que dice Widget de carga problemática. Si elimino la línea anterior todo funciona bien.

LogCat dice:

updateAppWidget no pudo encontrar ningún punto de vista , usando vista de error

android.widget.RemoteViews $ ActionException: vista: android.widget.TextView no puede uso método con el RemoteViews: setBackgroundResource (int)

Respuesta

0

La razón es que a través de RemoteViews puede llamar a un solo limitado montaje de métodos. En caso de que esté prohibido, recibirá un mensaje como este.

Tom

+0

Exactamente. Solo puede usar métodos que tengan la anotación @RemotableViewMethod –

1

Tomas es correcto. Mi solución es hacer dos vistas con los fondos respectivos y hacer una INVISIBLE y la otra VISIBLE. Por supuesto, esto solo funciona con una pequeña cantidad de fondos, por ejemplo, "verde" y "rojo" que pueden indicar algún estado.

0

Lo que me parece extraño de esto es que funciona muy bien en mi nexo uno (2.2), pero no en absoluto en un HTC Tattoo (1.6). Voy a intentar ejecutar algunas pruebas de emulador y ver si no es solo otro caso de HTC que implementa perezosamente algún código subyacente de renderización de UI, que ya encontré con el tatuaje (los diseños se procesan de forma diferente a Android 1.6).

¿En qué dispositivo estaba probando esto?

+0

No funciona en mi emulador 2.1. Tal vez la restricción se eliminó en Android 2.2? Consulte también [este debate] (http://groups.google.com/group/android-developers/browse_thread/thread/aa000a36eadafaa5/a406589560d76784#a406589560d76784) en el grupo android-developers: parece que es una limitación bien conocida – MarkJ

+0

Ahora lo que hago es: views.setImageViewBitmap (R.id.background, BitmapFactory.decodeResource (context.getResources(), info.backgroundImageId)); Es mucho más molesto y menos eficiente, pero ahora me permite agregar temas descargables – DavidG

0

El emulador lo dejará pasar cuando ejecute un emulador 2.2, por lo que supongo que la restricción se levanta a partir de 2.2.

1

A partir de Android 2.2 este método se puede llamar, no antes.

55

Pruebe esto, funcionará bien.

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

¿Qué sucede si deseo conservar el dibujante? – TheOnlyAnil

+1

no funciona en ViewGroups como LinearLayout, funciona en vistas como TextView – IHeartAndroid

+0

Esta solución funciona en ViewGroups Lo probé. – Abdullah

6

Si desea establecer el color del texto en sí, utilizar

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

contentView.setInt (R.id.tv_contactText, "setBackgroundColor", color.parseColor (hexColor));

+0

esto funcionó para mí .... VOILA – peter

4

Si tiene alguna forma que el fondo de la Vista de Texto, donde el fondo se define en algún recurso estirable, entonces se puede utilizar

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

En instrucció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 my drawable_new) en su carpeta dibujable.

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