Я пытаюсь создать 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:посмотреть: android.widget. TextView не может использовать метод с RemoteViews: setBackgroundResource (интервал)
Причина в том, что через RemoteViews вы можете вызывать только ограниченное количество методов. В случае, если это запрещено, вы получите сообщение вроде этого.
Tom
Томас прав. Мое решение - сделать два вида с соответствующими фонами и сделать одно НЕВИДИМЫМ, а другое ВИДИМОМ. Конечно, это работает только с небольшим количеством фонов, например, «зеленый» и «красный», которые могут указывать на какое-то состояние.
Что мне показалось странным, так это то, что он отлично работает на моем nexus one (2.2), но не на HTC Tattoo (1.6). Я собираюсь попробовать запустить несколько тестов эмулятора и посмотреть, не является ли это еще одним случаем, когда HTC лениво реализует некоторый базовый код рендеринга пользовательского интерфейса, который я уже нашел с помощью Tattoo (макеты отображаются иначе, чем на стандартном Android 1.6).
На каком устройстве вы это тестировали?