Android AppWidget TextView: Как установить цвет фона во время выполнения - PullRequest
22 голосов
/ 16 марта 2010

Я пытаюсь создать 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 (INT)

Ответы [ 9 ]

61 голосов
/ 18 февраля 2011

Попробуйте, это будет работать нормально.

remoteView.setInt(R.id.message, "setBackgroundColor", 
        android.graphics.Color.BLACK);
7 голосов
/ 15 апреля 2016

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

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

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

<TextView
    android:id="@+id/change"
    android:background="@drawable/my_drawable">
</TextView
7 голосов
/ 03 октября 2013

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

remoteViews.setInt(R.id.tvAmountThisYear, "setTextColor",
                android.graphics.Color.RED);
5 голосов
/ 10 октября 2015

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

1 голос
/ 15 февраля 2011

Начиная с android 2.2 этот метод можно вызывать не раньше.

1 голос
/ 31 июля 2010

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

0 голосов
/ 24 ноября 2010

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

0 голосов
/ 23 августа 2010

Что мне показалось странным в этом, так это то, что он отлично работает на моем Nexus One (2.2), но совсем не работает на HTC Tattoo (1.6). Я собираюсь попробовать запустить несколько тестов эмулятора и посмотреть, не является ли это просто еще одним случаем, когда HTC лениво реализует некоторый базовый код рендеринга пользовательского интерфейса, который я уже нашел в Tattoo (макеты отображаются иначе, чем на стандартном Android 1.6).

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

0 голосов
/ 28 мая 2010

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

Том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...