每当 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);
我正在尝试制作一个应用程序,让用户 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);