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

Android RemoteViews, как установить ScaleType для ImageView внутри виджета?

Я разрабатываю виджет с изображением на боковой стороне, который может быть выбран пользователем на одном из экранов настроек. Затем изображение можно установить у пользователя с помощью ImageView.setScaleType( "ЦЕНТР" ). Это работает. Затем URL-адрес изображения сохраняется в настройках в виде URL-адреса, а также в кодировке Base64 String из Bitmap (потому что я хочу сжать изображение, и пользователь может повернуть его в настройках)

В виджетах загружается изображение. Это прекрасно работает. С URI и с Bitmap тоже. Также работает ScaleType ImageView и фиксированное значение в макете.

Но как я могу программно определить ScaleType ImageView в виджетах? Причина. Я хочу установить значение ScaleType в значение, которое пользователь выбрал в настройках. С RemoteViews мы не можем получить ImageView...

Я пробовал:


myRemoteViews.setString(R.id.myImage, "setScaleType", "CENTER" );


В файле журнала указано: Функция setScaleType недоступна для ImageView.

Кто-нибудь знает, как сделать это определение внутри AppWidget?

4b9b3361

Ответ 1

Вы можете использовать этот сегмент для программного масштабирования вида изображения.

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

Надеюсь, что это поможет...

Ответ 2

Если вы посмотрите на исходный код ImageView, вы можете увидеть, что методу setScaleType не хватает аннотации @android.view.RemotableViewMethod, поэтому он не может быть вызван через интерфейс RemoteViews.

Там есть обходное ограничение для этого ограничения, но это не очень хорошо: определите другой формат XML для каждого ScaleType, который вы хотите, и выберите между ними непосредственно перед созданием RemoteViews. Если ваш макет сложный или у вас есть несколько видов для применения этого обходного пути, вы можете использовать RemoteViews.addView, чтобы добавить конкретный ImageView макет внутри основного макета.

Я использую это обходное решение (с addView) для appwidgets в своем приложении Showr. Проблема с этим методом заключается в том, что пусковая установка имеет ошибку: если вы измените тип шкалы существующего appwidget, создав новый RemoteViews и вызывая addView, чтобы добавить к нему другой макет ImageView, он не " всегда понимаем, что макет изменился.

Ответ 3

Поскольку нет простого способа вызвать setScaleType в представлении "удалить", работа, с которой я столкнулся, делала три изображения в моем макете, а затем меняла видимость тех, которые не имеют типа шкалы, выбранного пользователь:

    // first I declared a map to associate preference values with imageView ids

    private static final HashMap<Integer,Integer> widgetImageViewIds;

    static {
        widgetImageViewIds = new HashMap<Integer, Integer>();
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START, R.id.imageViewStart);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_CENTER, R.id.imageViewCenter);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_END, R.id.imageViewEnd);
    }

    ...

    // then when I update my widget show/hide the widgets based on the preference

    for (HashMap.Entry<Integer, Integer> entry : widgetImageViewIds.entrySet()) {
        Integer imageViewAlignment = entry.getKey();
        Integer imageViewId = entry.getValue();
        views.setViewVisibility(imageViewId, imageViewAlignment.intValue() != imageAlignmentPreferenceValue ? View.GONE : View.VISIBLE);
    }