Сохранить состояние Circleimageview внутри фрагмента - PullRequest
0 голосов
/ 11 июля 2019

У меня есть фрагменты с круговым изображением внутри, которые используются в качестве изображения профиля, которое впоследствии корректно сохраняется в базе данных.Моя проблема состоит в том, чтобы сохранить состояние изображения с помощью onSaveInstanceState и onPause / onStop, чтобы сохранить их состояние до сохранения их в базе данных и после, например, выполнения поворота экрана.Это мой код

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?

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Поставьте код перед методом super ().

 @Override
public void onStop() {
    if(bytes!=null)
    getActivity().getIntent().putExtra("bytes",bytes);
    super.onStop();

}
0 голосов
/ 11 июля 2019

Самый простой способ Используйте ViewModel со своим фрагментом.

См .: https://developer.android.com/topic/libraries/architecture/viewmodel.html

Обновление :

Шаг 1: Добавить Просмотр зависимости модели в build.gradle

def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle viewmodel:$lifecycle_version" 

Шаг 2. Создание ViewModel для фрагмента

public class MyFragmentViewModel extends ViewModel {
}

Шаг 3. Установка ViewModel в MyFragment

public class MyFragment extends Fragment {
 public void onStart() {
     MyFragmentViewModel userModel = ViewModelProviders.of(getActivity()).get(MyFragmentViewModel.class);
 }
}
...