Фрагмент, не связанный с исключением диспетчера фрагментов в getParentFragmentManager - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть фрагмент в приложении Photo. Когда пользователь редактирует фотографию,

  1. Я запускаю AsyncTask для сжатия изображения на заднем плане, которое возвращает сжатые байты изображения.
  2. В postExecute () я вызываю метод editComplete, который обновит мою модель данных сжатыми байтами изображений
  3. Как только это будет сделано, я вызываю getParentFragmentManager для popBackStack, чтобы удалить режим редактирования для режима галереи

Здесь при вызове getParentFragmentManager () я получаю IllegalStateException: «Fragment» + this + «не связан с менеджером фрагментов.»

My Fragment Asyn c task:

protected class CompressBitmapImageTask extends AsyncTask<Void, Void, byte[]>
    {
        private Bitmap editedImageBitmap;
        private BitmapDownscale bitmapDownscale;

        CompressBitmapImageTask(Bitmap editedImageBitmap, BitmapDownscale bitmapDownscale)
        {
            this.editedImageBitmap = editedImageBitmap;
            this.bitmapDownscale = bitmapDownscale;
        }

        @Override
        protected byte[] doInBackground(Void... params)
        {
            BitmapDownscale.BitmapDownscaleResult result = bitmapDownscale.downscaleFromBitmap(editedBitmap, true);
            return result.bitmapBytes;
        }

        @Override
        protected void onPostExecute(byte[] bytes)
        {
            onEditImageComplete(bytes);
        }
    } 
protected void onEditImageComplete(@Nullable byte[] editedBitmapData)
    {
        if (editedBitmapData != null)
            photoModel.editedBitmapData = editedBitmapData;
        getParentFragmentManager().popBackStack();
    }

Я получаю исключение при вызове getParentFragmentManager (). Я ссылался на соответствующий пост, Фрагмент MyFragment, не прикрепленный к Activity Но это связано с тем, что фрагмент не связан с Activity. Поэтому я не уверен, что добавление isAdded() решит проблему в моем случае. В идеале, мне нужно убедиться, что fragManager не является нулевым, пока я пытаюсь открыть backStack (). Единственный метод, который делает это isStateSaved () в androidx.fragment.app.Fragment, но я не думаю, что это подходящий метод. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 02 апреля 2020

После прочтения Android документов в Менеджере фрагментов и этого ответа Фрагмент MyFragment, не прикрепленный к Деятельности , я считаю, что проверка isAdded () - это способ подтверждения того, связан ли фрагмент с действием через fragmentManager. Сначала было непонятно смотреть на определение метода,

/**
         * Return true if the fragment is currently added to its activity.
         */
        final public boolean isAdded() {
            return mHost != null && mAdded;
} 

Потому что это говорит о том, что хост не равен нулю и добавлен ли фрагмент. Я думаю, что ключ mAdded, который говорит нам, был ли фрагмент добавлен в Диспетчер фрагментов. Поэтому я обновил свою логику popstack c проверкой,

    protected void onEditImageComplete(@Nullable byte[] editedBitmapData)
    {
        if (editedBitmapData != null)
            photoModel.editedBitmapData = editedBitmapData;
        if (isAdded())
            getParentFragmentManager().popBackStack();
    } ```
...