我有一个列表视图,每行有两个图像按钮。当用户单击列表行时,它将启动一个新活动。由于相机布局的问题,我不得不创建自己的选项卡。为结果启动的活动是一个映射。如果单击我的按钮启动图像预览(从SD卡加载图像),应用程序将从活动返回到结果处理程序的ListView活动,以重新启动我的新活动,它只不过是一个图像小部件
正在使用光标和ListAdapter在ListView上进行图像预览。这使它变得非常简单,但我不确定如何将调整大小的图像(即较小的位大小而不是像素)作为动态图像按钮的src。因此,我只是调整了手机摄像头的图像大小
问题是,当它试图返回并重新启动第二个活动时,我收到一个OutOfMemoryError
- 有没有一种方法可以让我一行一行地轻松构建列表适配器,这样我就可以动态调整大小(按位调整大小)
由于焦点问题,我无法使用触摸屏选择行,因此我还需要对每行中的小部件/元素的属性进行一些更改,因此这将是更好的选择。(我可以使用rollerball。)
- 我知道我可以做带外调整大小和保存我的图像,但这不是我真正想要做的,但一些示例代码会很好
当我在列表视图中禁用图像时,它又恢复了正常工作
仅供参考:我就是这样做的:
String[]from=new String[]{DBHelper.KEY\u BUSINESSNAME,DBHelper.KEY\u ADDRESS,
DBHelper.KEY_CITY,DBHelper.KEY_GPSLONG,DBHelper.KEY_GPSLAT,
DBHelper.KEY_IMAGEFILENAME+";};
int[]to=new int[]{R.id.businessname,R.id.address,R.id.city,R.id.gpslong,
R.id.gpslat,R.id.imagefilename};
notes=新的SimpleCursorAdapter(this,R.layout.notes_行,c,from,to);
setListAdapter(注释);
其中R.id.imagefilename是一个按钮图像
这是我的日志:
01-25 05:05:49.877:错误/dalvikvm堆(3896):6291456字节外部分配对此进程太大。
01-25 05:05:49.877:错误/(3896):VM不允许我们分配6291456字节
01-25 05:05:49.877:错误/AndroidRuntime(3896):未捕获处理程序:由于未捕获异常而退出主线程
01-25 05:05:49.917:错误/AndroidRuntime(3896):java.lang.OutOfMemoryError:位图大小超出VM预算
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.graphics.BitmapFactory.NativeDecodeseam(本机方法)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:304)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:149)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:174)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.graphics.drawable.drawable.createFromPath(drawable.java:729)中
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.widget.ImageView.resolveUri(ImageView.java:484)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.ImageView.setImageURI(ImageView.java:281)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:183)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:129)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.CursorAdapter.getView(CursorAdapter.java:150)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.AbsListView.obtainView(AbsListView.java:1057)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.ListView.makeAndAddView(ListView.java:1616)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.ListView.fillSpecific(ListView.java:1177)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.ListView.layoutChildren(ListView.java:1454)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.widget.AbsListView.onLayout(AbsListView.java:937)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.view.layout(view.java:5611)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.widget.LinearLayout.layouuthorizontal(LinearLayout.java:1108)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.LinearLayout.onLayout(LinearLayout.java:922)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.view.layout(view.java:5611)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.widget.FrameLayout.onLayout(FrameLayout.java:294)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.view.layout(view.java:5611)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.LinearLayout.layoutVertical(LinearLayout.java:999)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.widget.LinearLayout.onLayout(LinearLayout.java:920)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.view.layout(view.java:5611)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.widget.FrameLayout.onLayout(FrameLayout.java:294)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.view.layout(view.java:5611)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.ViewRoot.performTraversals(ViewRoot.java:771)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.view.ViewRoot.handleMessage(ViewRoot.java:1103)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.os.Handler.dispatchMessage(Handler.java:88)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在android.os.Looper.loop(Looper.java:123)上
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于android.app.ActivityThread.main(ActivityThread.java:3742)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于java.lang.reflect.Method.invokenactive(本机方法)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于java.lang.reflect.Method.invoke(Method.java:515)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
01-25 05:05:49.917:ERROR/AndroidRuntime(3896):在dalvik.system.NativeStart.main(本机方法)
01-25 05:10:01.127:错误/AndroidRuntime(3943):错误:线程连接失败
在显示图像时,我还有一个新错误:
22:13:18.594:DEBUG/skia(4204):xxxxxxxxxx jpeg错误20对处于%d状态的jpeg库的调用不正确
22:13:18.604:INFO/System.out(4204):错误位图uri上的resolveUri失败:
22:13:18.694:错误/dalvikvm堆(4204):6291456字节外部分配对此进程太大。
22:13:18.694:错误/(4204):虚拟机不允许我们分配6291456字节
22:13:18.694:调试/skia(4204):XXXXXXXXXXXXXXXXXXXXXXXXX allocPixelRef失败
要修复OutOfMemory错误,应执行以下操作:
BitmapFactory.Options=new BitmapFactory.Options();
options.inSampleSize=8;
位图预览\位图=位图工厂.decodeStream(is,null,选项);
此inSampleSize选项可减少内存消耗
这里有一个完整的方法。首先它读取图像大小而不解码内容本身。然后它找到最佳的inSampleSize值,它应该是2的幂,最后图像被解码
//解码图像并对其进行缩放以减少内存消耗
私有位图解码文件(文件f){
试一试{
//解码图像大小
BitmapFactory.Options o=新的BitmapFactory.Options();
o、 inJustDecodeBounds=true;
解码流(新的FileInputStream(f),null,o);
//我们要扩展到的新尺寸
所需的最终int_尺寸=70;
//找到正确的刻度值。它应该是2的幂。
int标度=1;
而(外径/刻度/2>;=所需尺寸;
o、 外形高度/比例/2>;=所需尺寸){
比例*=2;
}
//用inSampleSize解码
BitmapFactory.Options o2=新的BitmapFactory.Options();
o2.inSampleSize=刻度;
返回BitmapFactory.decodeStream(新文件输入流(f),null,o2);
}catch(filenotfound异常){}
返回null;
}