繁体   English   中英

ImageView在onActivityResult中的更改时未更新

[英]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会丢失。

第一个问题可以通过Glidesignature很好地解决,第二个问题可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM