我在Android KitKat API19上测试以下代码。我已经采用了我的例子中的元素并在下面显示了它们。简单的应用程序采用ImageButton,单击该按钮时,您可以选择一次选择的图像替换ImageButton上的默认图像。 当我的应用程序只能阅读带有标准文件路径的图库照片时,生活很简单,但现在您可以选择Google+,Dropbox或文件管理器图像,我必须检查" http"在照片字符串中查看是否需要使用其他机制来显示图像。
private Bitmap photo = null;
private ImageButton b_photo;
b_photo.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, SELECT_PICTURE);
}
return true;
}
});
b_photo = (ImageButton) findViewById(R.id.b_photo);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SELECT_PICTURE && resultCode == Activity.RESULT_OK)
try {
// We need to recyle unused bitmaps
if (photo != null) {
photo.recycle();
}
if (data.getData().toString().contains("http")) {
Uri uriPhoto = Uri.parse(data.getData());
InputStream stream = getContentResolver().openInputStream(
uriPhoto);
photo = BitmapFactory.decodeStream(stream);
stream.close();
b_photo.setImageBitmap(photo);
} else {
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
Drawable filePhoto = pathToDrawable(selectedImagePath);
b_photo.setImageDrawable(filePhoto);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
super.onActivityResult(requestCode, resultCode, data);
}
后一种情况" b_photo.setImageDrawable(filePhoto);"工作良好;因此,从图库中选择本地照片后,将使用照片更新ImageButton。 问题在于" b_photo.setImageBitmap(照片);"代码,ImageButton不会更新。我已尝试对图像进行硬编码,因此我知道我选择的图像没问题,我只是想知道我是否遗漏了某些内容,或者“#34”之间存在细微差别; setImageDrawable"和" setImageBitmap"这需要某种额外的屏幕刷新。