[英]ImageView not updating on change in onActivityResult
我已经尝试过使用Picasso和在stackoverflow上可以找到的每种方法。 我正在用相机拍摄图像,并获得onActivity结果的值。 仅在退出并重新启动应用程序后,imageView才会更新。 我希望在我眼前改变imageview。 这些代码似乎都不起作用。
我试过了
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
profile.setImageBitmap(thumbnail);
}
});
单击确定后关闭相机视图时,没有任何反应。
我也试过这个:
Thread thread = new Thread()
{
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
profile.setImageBitmap(thumbnail);
}
});
}
};
thread.start();
但UI不变,图像保持不变。
我尝试了异步任务,毕加索也不起作用。
Idk怎么做,已经有一段时间了,我非常沮丧
这是两种技术的代码:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && data != null) {
final Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
final File destination = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "temp.jpg");
FileOutputStream fo;
try {
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
uploadProfilePicToS3(destination.getAbsolutePath());
//this doesn't work
Thread thread = new Thread()
{
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
profile.setImageBitmap(thumbnail);
}
});
}
};
thread.start();
//not working either!
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
profile.setImageBitmap(thumbnail);
}
});
ImageView
未更新的原因是:1)Android将加载缓存中的先前图像,只要您将图像保存到相同的目的地2)在onResume
之前调用onActivityResult
。 这意味着在调用onResume
时,您加载到ImageView
中的ImageView
会丢失。
第一个问题可以通过Glide
的signature
很好地解决,第二个问题可以使用onSavedInstanceState()
处理。
更改图像时创建一个Glide signature
。 每次更改(例如,当前时间)应该不同。 然后在加载图像时应用signature
。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && data != null) {
final Bitmap bitmap = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
final File destination = new File(
Environment.getExternalStorageDirectory()
.getAbsolutePath(), "temp.jpg");
FileOutputStream fo;
try {
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.flush();
} catch (IOException e) {
e.printStackTrace();
}
Uri uri = Uri.fromFile(destination)
//Create your signature
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss",
Locale.getDefault());
String timeStamp = dateFormat.format(new Date());
newImageSignature = new RequestOptions()
.signature(new ObjectKey(timeStamp));
//Load your image
Glide.with(yourActivity.this) // Or Fragment
.load(bitmap) // Or Uri
.apply(newImageSignature)
.into(imageView);
// You can save the uri and signature to Firebase Database,
// and your image to Storage here
然后将新signature
保存在onSaveInstanceState()
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (newImageSignature != null) {
outState.putString("IMAGE_SIGNATURE”, newImageSignature.toString());
outState.putString("IMAGE_URI”, uri.toString());
}
}
现在您可以在onCreate()
检索signature
Uri ImageUri;
ImageView imageView;
RequestOptions imageSignature;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Retrieve your saved parameters. Or get them from a database.
if (savedInstanceState != null){
imageSignature = new RequestOptions()
.signature(new
ObjectKey(savedInstanceState.getString("IMAGE_SIGNATURE")));
imageUri = Uri.parse(savedInstanceState.getString("IMAGE_URI"));
// Instantiate your imageview
// Load image
if(imageUri != null && imageSignature != null){
Glide.with(yourActivity.this) // Or Fragment
.load(bitmap) // Or Uri
.apply(newImageSignature)
.into(imageView);
}
}
注意:我只是写了这个,还没有测试。 希望它能给
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.