Восстановить состояние фрагмента после ActivityResult - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над фрагментом, который отображает список изображений.У него есть кнопка «Добавить изображение», которая запускает намерение для результата с этими значениями.

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);
}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Я только имитировал вашу ситуацию и не нашел ошибки (список сохраняет новое значение со старыми значениями в списке).Единственная проблема, о которой я могу думать, это то, что вы неправильно инициализируете свой список.Что я сделал, так это инициализировал список в методе onCreate (), и когда я выбираю другое изображение, оно сохраняет это изображение в том же списке, а предыдущее изображение остается в списке. Нет необходимости сохранять список отдельно в saveInstanceBundle. Вот мой код фрагмента:

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){

        }

    }
}
}

Я могу поделиться Полным рабочим кодом моего проекта, если это необходимо.Для лучшего понимания жизненного цикла фрагмента, пожалуйста, просмотрите это изображение

0 голосов
/ 20 сентября 2019

Чтобы использовать onViewStateRestored, вам нужно вызвать 'setRetainInstance (true);'

...