我在ViewPagers和Camera应用程序上做了大量的文档研究,事实上一切都很好,除了GingerBread上的一个主要问题,我没有发现任何关于sso的问题,所以我会试着问这个…
在我的应用程序中有一个ViewPager(支持库v4)显示两个片段:一个,将它称为主片段,一个显示活动开始时,某些信息显示给用户,包括一个imageview,它最初是空的和隐藏的。
通过切换到下一个片段,用户看到相机预览,这是创建活动时创建的(即使它不显示直到swype)和拍照按钮。
当拍摄照片时,视图以编程方式被带回到主片段,即Imageview将加载新照片并取消隐藏,以便用户可以看到混合了其他预先存在信息的图像。
如果用户不喜欢这张照片,他可以再次切换回相机片段并拍摄另一张,如此反复,直到他对结果满意为止。
出于这个原因,在翻转回主片段之前,我调用mccamera . restartpreview(),并确保相机准备好,如果用户切换回来。
在Android 4上一切都运行得很顺利。但是当我在2.3.3 (API级别10)上测试时,当主片段被回调时,相机预览仍然在前景中,并隐藏视图。你可以看到,甚至滚动,视图的其余部分,在屏幕的部分,相机碎片显示按钮,但其余部分重叠的相机预览。
以下是相关函数的代码:CameraFragment onPictureTaken ()
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d(TAG, "Error creating media file, check storage permissions: ");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
Log.e(TAG, "FILE " +pictureFile.getAbsoluteFile().toString());
Bitmap bitmap = rotated(data);
bitmap.compress(CompressFormat.JPEG, PICTURE_QUALITY, fos);
bitmap.recycle(); //devo davvero chiamarla esplicitamente ??
mediaFile = pictureFile;
mPreview.restartPreview();
// go back to newpin activity to show it
((NewPinActivity) myActivity).newPin.setMedia(mediaFile.getAbsoluteFile().toString());
((NewPinActivity) myActivity).takeBack();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
}
}
};
和mainfragment takeBack()方法
public void takeBack(){
mViewPager.setCurrentItem(0, true);
String mainFragTag = "android:switcher:"+R.id.newpinpager+":0";
Fragment fragMain = this.getSupportFragmentManager().findFragmentByTag(mainFragTag);
try {
((NewPinMainFragment)fragMain).showPhoto(newPin.getMedia());
} catch (NullPointerException e){
}
}
有没有人知道这是ViewPager和GingerBread的问题,还是CameraPreview和GingerBread的问题?
我自己找到了答案,我把它贴在这里,以防对别人有用。
显然这个问题是由setCurrentItem方法的smoothscroll选项引起的。通过修改
修复了这个问题mViewPager.setCurrentItem(0, true);
mViewPager.setCurrentItem(0, false);