每当 activity 被杀死或导航到新的 activity 时,图像就会消失

Whenever the activity gets killed or navigated to new activity the image disappears

我正在尝试制作一个应用程序,让用户 select 在他们的个人资料上显示一张照片。我可以在 imageview 上浏览和设置他们的 selected 图像。但是一旦 activity 被破坏,图像就会丢失。我试图实现 onSaveInstanceState 但它仍然是一样的。我想知道我是否正确使用它。我希望你能帮助像我这样的新手。提前致谢。这是我正在使用的代码: PS: 我正在使用外部库来设置图像 我正在使用的图书馆:-

implementation 'com.github.dhaval2404:imagepicker:2.1'

主要Activity代码:-

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.github.dhaval2404.imagepicker.ImagePicker;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import org.jetbrains.annotations.NotNull;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    FloatingActionButton fab;
    Uri uri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView1);
        fab = findViewById(R.id.floatingActionButton1);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImagePicker.with(MainActivity.this)
//                        .crop()                   //Crop image(Optional), Check Customization for more option
//                        .compress(1024)           //Final image size will be less than 1 MB(Optional)
//                        .maxResultSize(1080, 1080)    //Final image resolution will be less than 1080 x 1080(Optional)
                        .start();

            }
        });
        if(savedInstanceState != null){
            uri = savedInstanceState.getParcelable("savedImage");
            imageView.setImageURI(uri);
        }else {
            Toast.makeText(MainActivity.this,"No Image",Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uri = data.getData();
        imageView.setImageURI(uri);
    }
    @Override
    protected void onSaveInstanceState(@NonNull @NotNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("savedImage",uri);
    }
}

当 activity 被杀死或导航时,包数据不会保留。它通常主要用于方向变化。它不会一直存在。

如果您需要持久保存的内容,我建议您将其保存在 SharedPreferences 中,尽管您无法直接保存它。您需要将 URI 转换为字符串。

在这里你可以看到一些进一步的参考

How to use SharedPreferences to save a URI, or any Storage?

将图像设置为 imageview 后,将 uri 存储到 sharedprefs。像这样

 SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
 editor.putString("myImage", uri);
 editor.apply();

然后,将您的吐司消息替换成这样。

 Uri storedImage = URI.create(prefs.getString("myImage", null));
 imageView.setImageURI(storedImage);