Подтвердить что ты не робот

Android AppWidget TextView: как установить цвет фона во время выполнения

Я пытаюсь создать AppWidget, в котором цвет фона TextView изменяется произвольно с заданным периодическим интервалом.

TextView определяется в XML файле макета как

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

В методе обновления я загрузил макет как

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

Чтобы изменить фон TextView, я использовал следующий оператор

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

Но я получаю виджет, говорящий о загрузке виджета. Если я удаляю вышеприведенную строку, все работает нормально.

LogCat говорит:

updateAppWidget не удалось найти просмотр с использованием представления об ошибке

android.widget.RemoteViews $ActionException: view: android.widget.TextView не может используйте метод RemoteViews: setBackgroundResource (целое)

4b9b3361

Ответ 1

Попробуй, все будет хорошо.

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

Ответ 2

Если вы хотите установить цвет самого текста, используйте

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

Ответ 3

Если у вас есть какая-то форма в качестве фона текстового поля, где фон определен в некотором ресурсе, который можно выделить, вы можете использовать

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

В приведенной выше инструкции кода R.id.change - это TextView с некоторым фоновым ресурсом, и вы определили некоторые ресурсы (my_drawable и мой drawable_new) в вашей папке с выделением.

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

Ответ 4

Томас прав. Мое решение состоит в том, чтобы сделать два вида с соответствующими фонами и сделать один НЕВИДИМЫЙ, а другой - ВИДИМЫМ. Конечно, это работает только с небольшим количеством фонов, например, "зеленый" и "красный", которые могут указывать на какое-то состояние.

Ответ 5

Как и для Android 2.2, этот метод можно назвать не раньше.

Ответ 6

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

Ответ 7

Причина в том, что с помощью RemoteViews вы можете вызывать только ограниченное количество методов. В случае, если это запрещено, вы получаете сообщение вроде этого.

Том

Ответ 8

Что я нахожу странным в этом, так это то, что он отлично работает на моей nexus one (2.2), но совсем не на HTC Tattoo (1.6). Я попытаюсь запустить некоторые тесты эмулятора и посмотреть, не является ли это еще одним случаем HTC, лениво реализующим некоторый базовый код визуализации UI, который я уже нашел с помощью Tattoo (Layouts визуализируется иначе, чем на бирже Android 1.6).

На каком устройстве вы тестировали это?

Ответ 9

Эмулятор позволит это пройти, когда вы запустите эмулятор 2.2, поэтому я думаю, что ограничение снято с 2.2.