java .lang.IllegalStateException: Фрагмент уже добавлен: BottomSheetFragment {fc9d1db} (f54104c4-f862-420b-b30a-3fbd835554cf)} - PullRequest
0 голосов
/ 13 июля 2020

Я добавил в свой проект BottomSheetDialogFragment. Вот пример кода ниже для лучшего понимания.

public class StickerBSFragment extends BottomSheetDialogFragment {

private ArrayList<String> arrayStickers;
private RecyclerView rvEmoji;

public StickerBSFragment() {
}

private StickerListener mStickerListener;

public void setStickerListener(StickerListener stickerListener) {
    mStickerListener = stickerListener;
}

public interface StickerListener {
    void onStickerClick(String sticker);
}

private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            dismissAllowingStateLoss();
        }
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
    }
};

@SuppressLint("RestrictedApi")
@Override
public void setupDialog(@NonNull Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), R.layout.fragment_sticker_dialog, null);
    dialog.setContentView(contentView);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
    CoordinatorLayout.Behavior behavior = params.getBehavior();

    if (behavior instanceof BottomSheetBehavior) {
        ((BottomSheetBehavior) behavior).addBottomSheetCallback(mBottomSheetBehaviorCallback);
    }
    ((View) contentView.getParent()).setBackgroundColor(getResources().getColor(android.R.color.transparent));
    rvEmoji = contentView.findViewById(R.id.rvEmoji);

    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 4);
    rvEmoji.setLayoutManager(gridLayoutManager);
    loadRowData();
}

private void loadRowData() {
    arrayStickers = new ArrayList<>();
    arrayStickers.clear();
    try {
        arrayStickers.addAll(new ArrayList<>(Arrays.asList(getContext().getAssets().list("joker"))));
        rvEmoji.setAdapter(new LabelAdapter(getContext(), "joker/", arrayStickers));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public class LabelAdapter extends RecyclerView.Adapter<LabelAdapter.ViewHolder> {

    private List<String> listImages;
    private Context context;
    private String folderName;

    public LabelAdapter(Context context, String folderName, ArrayList<String> listImages) {
        this.listImages = listImages;
        this.context = context;
        this.folderName = folderName;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_emoji_sticker, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        Glide.with(context).asBitmap()
                .load("file:///android_asset/" + folderName + listImages.get(position))
                .fitCenter().skipMemoryCache(false)
                .into(holder.imgSticker);

        holder.imgSticker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mStickerListener.onStickerClick(folderName + listImages.get(position));
                dismiss();
            }
        });
    }

    @Override
    public int getItemCount() {
        return (null != listImages ? listImages.size() : 0);
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imgSticker;

        ViewHolder(View itemView) {
            super(itemView);
            imgSticker = itemView.findViewById(R.id.imgSticker);
        }
    }
}

И код для показа фрагмента.

StickerBSFragment mStickerBSFragment = new StickerBSFragment();
mStickerBSFragment.show(getSupportFragmentManager(), mStickerBSFragment.getTag());

Этот код дает сбой на некоторых устройствах случайным образом. Я попытался найти решение, но никаких намеков по этому поводу. Журнал ошибок, созданный библиотекой Splunk Mint.

java.lang.IllegalStateException: Fragment already added: StickerBSFragment{fc9d1db} (f54104c4-f862-420b-b30a-3fbd835554cf)}
1   at androidx.fragment.app.FragmentStore.addFragment(FragmentStore.java:67)
2   at androidx.fragment.app.FragmentManager.addFragment(FragmentManager.java:1563)
3   at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:405)
4   at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
5   at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
6   at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
7   at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
8   at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
9   at android.os.Handler.handleCallback(Handler.java:873)
10  at android.os.Handler.dispatchMessage(Handler.java:99)
11  at android.os.Looper.loop(Looper.java:226)
12  at android.app.ActivityThread.main(ActivityThread.java:7191)
13  at java.lang.reflect.Method.invoke(Native Method)
14  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
15  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)

Что не так с этим кодом? Обновите его и помогите решить эту проблему.

...