Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RemoteView,如何在小部件内设置ImageView的ScaleType?_Android_Widget_Imageview - Fatal编程技术网

Android RemoteView,如何在小部件内设置ImageView的ScaleType?

Android RemoteView,如何在小部件内设置ImageView的ScaleType?,android,widget,imageview,Android,Widget,Imageview,我正在开发一个窗口小部件,右边有一个图像,用户可以在设置屏幕中选择。 然后,用户可以使用ImageView.setScaleType(“中心”)设置图像。这很有效。 然后,图像的URL作为URL存储在首选项中,也作为位图的Base64编码字符串存储(因为我想收缩图像,用户可以在设置中旋转图像) 在小部件中,我加载图像。那很好。使用URI和位图。 ImageView的ScaleType在布局中也设置为固定值,同样有效 但是如何以编程方式在小部件中定义ImageView的ScaleType? 因为我

我正在开发一个窗口小部件,右边有一个图像,用户可以在设置屏幕中选择。 然后,用户可以使用ImageView.setScaleType(“中心”)设置图像。这很有效。 然后,图像的URL作为URL存储在首选项中,也作为位图的Base64编码字符串存储(因为我想收缩图像,用户可以在设置中旋转图像)

在小部件中,我加载图像。那很好。使用URI和位图。 ImageView的ScaleType在布局中也设置为固定值,同样有效

但是如何以编程方式在小部件中定义ImageView的ScaleType? 因为我想将ScaleType设置为值,用户已经在设置中选择了。使用RemoteView,我们无法获取ImageView…

我试过:


设置字符串(R.id.myImage,“setScaleType”,“CENTER”)


日志文件显示:函数setScaleType不适用于ImageView


是否有人知道如何在AppWidget中定义此项?

您可以使用此段以编程方式设置图像视图的缩放类型

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

希望对您有所帮助……

如果您查看
ImageView
的源代码,您可以看到
setScaleType
方法缺少
@android.view.RemotableViewMethod
注释,因此无法通过
remoteview
接口调用它

对于这个限制,有一个解决方法,但它并不完美:为每个您想要的ScaleType定义一个不同的布局XML,并在创建
RemoteView
之前在它们之间进行选择。如果您的布局很复杂,或者您有多个视图要应用此解决方案,则可能需要使用将特定的
ImageView
布局添加到主布局中


我正在为我的应用程序中的AppWidget使用此变通方法(使用
addView
)。此方法的问题是stock launcher有一个bug:如果通过创建新的
RemoteView
并调用
addView
向现有appwidget添加不同的
ImageView
布局来更改appwidget的缩放类型,它并不总是意识到布局已经改变。

因为在移除视图上调用
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);
    }
//首先,我声明了一个映射,将首选项值与imageView ID关联起来
私有静态最终HashMap WidgetImageViewId;
静止的{
widgetImageViewIds=新HashMap();
widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START,R.id.imageViewStart);
widgetmageviewids.put(MyAppPreferences.PREF_ALIGN_CENTER,R.id.imageViewCenter);
WidgetImageViewId.put(MyAppPreferences.PREF_ALIGN_END,R.id.imageViewEnd);
}
...
//然后,当我更新我的小部件时,根据偏好显示/隐藏小部件
对于(HashMap.Entry:widgetImageViewIds.entrySet()){
整数imageViewAlignment=entry.getKey();
整数imageViewId=entry.getValue();
views.setViewVisibility(imageViewId,imageViewAlignment.intValue()!=imageAlignmentPreferenceValue?View.GONE:View.VISIBLE);
}

这是如何为普通的
图像视图设置缩放类型,但提问者在
远程视图中询问。不确定这是否可行,但是扩展
图像视图
并添加注释如何,然后自定义
图像视图
将调用
super.setcaletype(…)
您不能在
远程视图中使用自己的类,只能使用系统内置的类。