В поисках элегантного решения для кожи appwidget - PullRequest
3 голосов
/ 12 февраля 2010

У меня есть приложение appwidget, и я хочу, чтобы пользователи могли создавать скины, которые можно применять во время выполнения. Мое предпочтительное решение состоит в том, чтобы использовать apk-файлы с девятью патч-изображениями png, которые растягиваются, чтобы соответствовать виджету виджета ImageView, однако начинает казаться, что мне, возможно, придется использовать другой метод упаковки (например, zip-файлы).

Что я пробовал: Импортируем девять ресурсов патчей как Drawable с context.getResourcesForApplication (my.app) .getResources ..., преобразуем их в растровые изображения с помощью canvas и устанавливаем растровое изображение в RemoteView с помощью setImageViewBitap. Это не сработало, потому что мне нужно было указать размер результирующего представления (myBitmap.setBounds (.., ..)) во время преобразования, а некоторые ширины / высоты в моем appwidget не исправлены. Возможно, есть способ получить высоту и т. Д., Которые я пропустил.

Импорт ресурсов непосредственно в RemoteView с помощью setImageViewUri () Это не работает, потому что функция, кажется, больше не читает android.resource: // Uri's (я искал в источнике ImageView, и кажется, что он только читает пути к файлам и контент: // Uri's)

Импорт ресурсов непосредственно в RemoteView с помощью setImageViewResource (), который не работал, поскольку идентификатор, полученный из внешнего пакета, очевидно, не включает ссылку на пакет.

Чего я пытаюсь избежать, так это жесткого кодирования ширины и высоты всего моего приложения, или использования отдельной схемы упаковки.

Кто-нибудь реализовал скины appwidget и хочет поделиться своими знаниями? С другой стороны, в моей логике может быть дыра, на которую можно указать.

Я могу предоставить код, если требуется, хотя у меня его сейчас нет.

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Я нашел этот пример решения http://www.siroccosoftware.com/devblog/?p=10

ImageView

Uri path = Uri.parse("android.resource://PACKAGE_NAME/RESOURCE_ID");

views.setImageViewUri(ID, path); 

RemoteView

RemoteViews views = new RemoteViews("PACKAGE_NAME", "LAYOUT_RESOURCE_ID");
1 голос
/ 10 декабря 2010

Я столкнулся с кодом для ImageView, когда пытался решить эту проблему.

Оказывается, что если URI не является URI "содержимого", то ImageView пытается открыть его с помощью вызова Drawable.createFromPath(mUri.toString()), который, по сути, хочет путь, а не URI.

Если вы удалите раздел "file: ///" вашего URI, он будет работать нормально.

Чтобы вы могли обновить свой код следующим образом:

views.setImageViewUri(R.id.alarm, Uri.parse(f.getAbsolutePath()); 
...