android - 将 Circleimageview 的状态保存在片段内
问题描述
我有一个带有 circleimageview 的片段,用作稍后正确保存在数据库中的个人资料图像。我的问题是使用 onSaveInstanceState 和 onPause/onStop 保存 imageview 的状态,以在将它们保存到数据库之前以及在执行屏幕旋转之后保持它们的状态。这是我的代码
public class MyFragment extends Fragment implements View.OnClickListener {
private CircleImageView mPhoto;
private byte[] bytes = null;
private Bitmap photo = null;
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if(bytes!=null) {
outState.putByteArray("bytes", bytes);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
LayoutInflater lf = getActivity().getLayoutInflater();
view = lf.inflate(R.layout.my_fragment,container,false);
mPhoto = (CircleImageView) view.findViewById(R.id.photo);
view.findViewById(R.id.photo).setOnClickListener(this);
if(savedInstanceState!=null){
if(savedInstanceState.containsKey("bytes")){
bytes = savedInstanceState.getByteArray("bytes");
if(bytes != null) {
//but with a screen rotation the image is not restored
photo = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
mPhoto.setImageBitmap(photo);
}
}
}
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.photo:
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
try {
startActivityForResult(Intent.createChooser(i, "Select Picture"), 0);
}catch (ActivityNotFoundException ex){
ex.printStackTrace();
}
break;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0 && resultCode == Activity.RESULT_OK) {
Uri path = data.getData();
Bitmap tmp = null;
try {
tmp = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), path);
} catch (IOException e) {
e.printStackTrace();
}
if(tmp != null) {
mPhoto.setImageBitmap(photo);
bytes = getBitmapAsByteArray(photo);
//tested, bytes is not null and the photo are restored correctly when saved on the database
}
}
}
@Override
public void onResume() {
super.onResume();
bytes = getActivity().getIntent().getByteArrayExtra("bytes");
if(bytes != null) {
//here bytes is null
photo = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
mPhoto.setImageBitmap(photo);
}
}
@Override
public void onStop() {
super.onStop();
if(bytes!=null)
getActivity().getIntent().putExtra("bytes",bytes);
}
}
这样在屏幕旋转过程中图像不保持不变,如何正确实现onsavedInstanceState、onStop和onResume?
解决方案
最简单的方法将 ViewModel 与您的片段一起使用。
参考:https ://developer.android.com/topic/libraries/architecture/viewmodel.html
更新:
Step1:在build.gradle中添加View Model依赖
def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle viewmodel:$lifecycle_version"
第 2 步:为 Fragment 创建 ViewModel
public class MyFragmentViewModel extends ViewModel {
}
第三步:在 MyFragment 中设置 ViewModel
public class MyFragment extends Fragment {
public void onStart() {
MyFragmentViewModel userModel = ViewModelProviders.of(getActivity()).get(MyFragmentViewModel.class);
}
}
推荐阅读
- android - 为整个应用设置 alertDialog 的样式
- android - 使用 Jitpack git 存储库的 Gradble 同步失败
- php - nginx serves 404 for all php files but index.php
- set - 在 MIPS 中编码基本指令格式
- swift - AKMIDICallbackInstrument 实现问题
- c++ - 什么数据类型用于自定义基于堆栈的分配器的缓冲区?
- postgresql - 为什么 syslog-ng 将日志插入多行表中?
- shell - 使用多个并发 MPI LAMMPS 作业减慢速度
- c# - .Net Core 2.1 的 JwtSecurityTokenHandler() 问题;
- python - 浏览特定页数的文件