android - ActivityResult 后恢复片段状态
问题描述
我正在处理一个显示图像列表的片段。它有一个用于“添加图像”的按钮,用于启动具有这些值的结果意图。
type: "image/*"
action: Intent.ACTION_GET_CONTENT
问题是:在用户选择一张图片并返回到片段后,列表中的所有其他图片(存储在代码上的某个 ArrayList<> 中)都消失了。
我已经覆盖了该方法onSaveInstanceState(Bundle)
并将列表保存在包中。问题是,没有办法恢复它。
我想过覆盖onViewStateRestored(Bundle)
,但它没有工作。当我把Log.d()
所有的“onXXX”方法都放了一些的时候,我发现每次添加文件时只有这三个被执行(实际顺序):
onPause()
onSaveInstanceState(Bundle)
//now the image picker opens up
//user picks the image
onResume()
//image picker closes and fragment is now on screen
我想过使用一些“getXXX”方法,onResume()
但我找不到有用的方法。我能做些什么?
编辑:这是我的代码(没有无关的东西)。
@Override public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("debugaff", "oncreate");
setRetainInstance(true);
this.attachments = (ArrayList<Attachment>) getActivity().getIntent().getSerializableExtra(ExtraKeys.ATTACHMENTS);
}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
Log.d("debugaff", "oncreateview");
rootView = inflater.inflate(R.layout.fragment_attachments_form, container, false);
//....
if(savedInstanceState == null){
getLoaderManager().initLoader(0, null, this);
} else {
attachmentsRvAdapter.setItems((List<Attachment>) savedInstanceState.getSerializable(ExtraKeys.TEMP_ATTACHMENTS));
}
//....
return rootView;
}
@Override public void onResume(){
super.onResume();
Log.d("debugaff", "onresume");
hideKeyboard();
}
@Override public void onPause(){
super.onPause();
setRetainInstance(true); //called this to make it 100% redundant (already called it at onCreate)
Log.d("debugaff", "onpause");
}
@Override public void onViewStateRestored(@Nullable Bundle savedInstanceState){
Log.d("debugaff", "onviewstaterestored");
if(savedInstanceState == null){
getLoaderManager().initLoader(0, null, this);
} else {
attachments.addAll((List<Attachment>) savedInstanceState.getSerializable(ExtraKeys.TEMP_ATTACHMENTS));
attachmentsRvAdapter.setItems(attachments);
}
super.onViewStateRestored(savedInstanceState);
}
解决方案
我刚刚模仿了您的情况,没有发现错误(列表将新值与列表中的旧值一起保存)。我能想到的唯一问题是您没有正确初始化列表。我所做的是在 onCreate() 方法中初始化列表,当我选择另一个图像时,它将该图像保存在同一个列表中,而前一个图像仍在列表中。无需将列表单独保存在 savedInstanceBundle 中。这是我的片段代码:
public class SelectListFragment extends Fragment {
private static final int PICK_IMAGE_REQUEST = 11;
public SelectListFragment() {
// Required empty public constructor
}
List listOfImagesSelected;
Button selectButton;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listOfImagesSelected=new ArrayList<Bitmap>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_select_list, container, false);
selectButton = view.findViewById(R.id.selectButton);
selectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//I am retrieving the Bitmap from the intent and saving into the list
if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) {
Uri uri = data.getData();
try {
//making the bitmap from the link of the file selected
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
listOfImagesSelected.add(bitmap);
}catch (Exception e){
}
}
}
}
如果需要,我可以分享我的项目的完整工作代码。为了更好地理解片段生命周期,请查看此图片
推荐阅读
- html - 某些图像不会出现在 codepen 中,但会出现在 we3schools 中
- r - R将一列中的日期与多列中的日期进行比较
- mysql - mysql 三表加入group by 每天
- javascript - react-router v6:使用 searchParams 导航到 URL
- python - python .apply 每天不包括几个小时
- sqlite - SQLite 比较两个表并获取实际行
- javascript - 在javascript中按字段合并两个复杂的对象数组
- r - 有什么方法可以将图片(.png)放在 ggplotly 工具提示中?
- html - 如何将 Angular 项目转换为非 Angular 项目?
- node.js - 在 NodeJS 中的 URL 之前添加字符串