Android java.lang.IllegalStateException:フラグメントはすでに追加されています

Hasan Kucuk

Webサービスからのリクエストを待機している読み込みオブジェクトを取得しています。しかし、このオブジェクトによってアプリケーションが終了することがあります。エラーの原因を正確に検出できませんでした。

このエラーを防ぐために、アクティビティの受け渡し中にオブジェクトを「dismiss」と「cancel」と呼びましたが、これは機能しませんでした。次に、どちらも機能しない「null」の値を割り当てました。タグを扱っていると思ったので、二度と働きませんでした。

私のエラーコード;

2019-03-27 11:51:20.502 29685-29685/com.xxxx.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.xxxx.app, PID: 29685
    java.lang.IllegalStateException: Fragment already added: DelayedProgressDialog{d8bd442 #1 Delaleyed}
        at androidx.fragment.app.FragmentManagerImpl.addFragment(FragmentManager.java:1916)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:765)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:6981)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

進行状況ダイアログクラスを使用しています。

    public class DelayedProgressDialog extends DialogFragment {
    private static final int DELAY_MILLISECOND = 450;
    private static final int MINIMUM_SHOW_DURATION_MILLISECOND = 300;
    private static final int PROGRESS_CONTENT_SIZE_DP = 80;

    private ProgressBar mProgressBar;
    private boolean startedShowing;
    private long mStartMillisecond;
    private long mStopMillisecond;

    private FragmentManager fragmentManager;
    private String tag;
    private Handler showHandler;

    // default constructor. Needed so rotation doesn't crash
    public DelayedProgressDialog() {
        super();
    }

    @NonNull
    @SuppressLint("InflateParams")
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        builder.setView(inflater.inflate(R.layout.dialog_progress, null));
        return builder.create();
    }

    @Override
    public void onStart() {
        super.onStart();
        mProgressBar = getDialog().findViewById(R.id.progress);

        if (getDialog().getWindow() != null) {
            int px = (int) (PROGRESS_CONTENT_SIZE_DP * getResources().getDisplayMetrics().density);
            getDialog().getWindow().setLayout(px, px);
            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        }
    }

    @Override
    public void show(FragmentManager fm, String tag) {
        if (isAdded())
            return;

        this.fragmentManager = fm;
        this.tag = tag;
        mStartMillisecond = System.currentTimeMillis();
        startedShowing = false;
        mStopMillisecond = Long.MAX_VALUE;

        showHandler = new Handler();
        showHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // only show if not already cancelled
                if (mStopMillisecond > System.currentTimeMillis())
                    showDialogAfterDelay();
            }
        }, DELAY_MILLISECOND);
    }

    private void showDialogAfterDelay() {
        startedShowing = true;

        DialogFragment dialogFragment = (DialogFragment) fragmentManager.findFragmentByTag(tag);
        if (dialogFragment != null) {
            fragmentManager.beginTransaction().show(dialogFragment).commitAllowingStateLoss();
        } else {
            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.add(this, tag);
            ft.commitAllowingStateLoss();
        }
    }

    public void cancel() {
        if(showHandler == null)
            return;

        mStopMillisecond = System.currentTimeMillis();
        showHandler.removeCallbacksAndMessages(null);

        if (startedShowing) {
            if (mProgressBar != null) {
                cancelWhenShowing();
            } else {
                cancelWhenNotShowing();
            }
        } else
            dismiss();
    }

    private void cancelWhenShowing() {
        if (mStopMillisecond < mStartMillisecond + DELAY_MILLISECOND + MINIMUM_SHOW_DURATION_MILLISECOND) {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    dismiss();
                }
            }, MINIMUM_SHOW_DURATION_MILLISECOND);
        } else {
            dismiss();
        }
    }

    private void cancelWhenNotShowing() {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                dismiss();
            }
        }, DELAY_MILLISECOND);
    }

    @Override
    public void dismiss() {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.remove(this);
        ft.commitAllowingStateLoss();
    }
}
Hasan Kucuk

私はついに解決策を見つけました。「showDialogAfterDelay」関数で「findFragmentByTag」のタグを探していました。しかし、これは決して実現しませんでした。「追加」かどうかわかりませんでした。これを解決するために使用するコードの一部。

        fragmentManager.executePendingTransactions();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

java.lang.IllegalStateException:フラグメントはすでに追加されています:MovieFragment

分類Dev

java.lang.IllegalStateException:すでに追加されているフラグメント

分類Dev

フラグメントを置き換えるときに「java.lang.IllegalStateException:フラグメントはすでに追加されています」を防ぐにはどうすればよいですか?

分類Dev

android-java.lang.IllegalStateException:フラグメントがコンテキストにアタッチされていません

分類Dev

java.lang.IllegalStateException:Androidのアクティビティの問題にフラグメントが添付されていません

分類Dev

Xamarin.Forms.Android:java.lang.IllegalStateException:フラグメントにビューがありません

分類Dev

Androidのネストされたフラグメント-java.lang.IllegalStateException:アクティビティが破棄されました

分類Dev

Jacoco mavenプラグインが例外でコンソールを詰まらせる-java.lang.IllegalStateException:クラスはすでにインストルメント化されています

分類Dev

Android 8.0:java.lang.IllegalStateException:サービスインテントの開始は許可されていません

分類Dev

java.lang.IllegalStateException ConstraintLayoutには、フラグメントに設定されたNavControllerがありません

分類Dev

Androidビルドの失敗-java.lang.IllegalArgumentException:すでに追加されています:Lcom / google / api / client / escape / CharEscapers;

分類Dev

onRequestPermissionsResult()のAndroid java.lang.IllegalStateException

分類Dev

Android Kotlin:java.lang.IllegalStateException

分類Dev

Androidのjava.lang.IllegalStateException

分類Dev

原因:java.lang.IllegalStateException:ParsePluginsはすでに初期化されています

分類Dev

java.lang.IllegalStateException:フラグメントがコンテキストにアタッチされていません

分類Dev

java.lang.IllegalStateException:アクティビティにフラグメントがアタッチされていません

分類Dev

応答はすでにコミットされています-java.lang.IllegalStateException:UT010019

分類Dev

Android-java.lang.IllegalStateException:すでに閉じられているオブジェクトを再度開こうとします:SQLiteQuery:select * from table where rowid = 40495

分類Dev

java.lang.IllegalStateExceptionが原因:デタッチされたフラグメントのViewModelProviderを作成できません

分類Dev

androidフラグメントを使用したjava.lang.NullPointerException

分類Dev

androidフラグメントjava.lang.nullpointerexception

分類Dev

java.lang.IllegalStateException:setDoOutputですでに接続されています

分類Dev

java.lang.IllegalStateException:setDoOutputですでに接続されています

分類Dev

Ionic Androidビルド:java.lang.IllegalStateException:buildToolsVersionが指定されていません

分類Dev

java.lang.IllegalStateExceptionの解決策はありますか:返信はすでに送信されています

分類Dev

Androidフォアグラウンドサービスは常に「java.lang.IllegalArgumentException:サービスが登録されていません」という例外をスローします

分類Dev

フラグメントのテスト:java.lang.RuntimeExceptionが発生し続けます:android.view.InflateException

分類Dev

java.lang.IllegalStateException:すでに接続されています(Discord JDA)

Related 関連記事

  1. 1

    java.lang.IllegalStateException:フラグメントはすでに追加されています:MovieFragment

  2. 2

    java.lang.IllegalStateException:すでに追加されているフラグメント

  3. 3

    フラグメントを置き換えるときに「java.lang.IllegalStateException:フラグメントはすでに追加されています」を防ぐにはどうすればよいですか?

  4. 4

    android-java.lang.IllegalStateException:フラグメントがコンテキストにアタッチされていません

  5. 5

    java.lang.IllegalStateException:Androidのアクティビティの問題にフラグメントが添付されていません

  6. 6

    Xamarin.Forms.Android:java.lang.IllegalStateException:フラグメントにビューがありません

  7. 7

    Androidのネストされたフラグメント-java.lang.IllegalStateException:アクティビティが破棄されました

  8. 8

    Jacoco mavenプラグインが例外でコンソールを詰まらせる-java.lang.IllegalStateException:クラスはすでにインストルメント化されています

  9. 9

    Android 8.0:java.lang.IllegalStateException:サービスインテントの開始は許可されていません

  10. 10

    java.lang.IllegalStateException ConstraintLayoutには、フラグメントに設定されたNavControllerがありません

  11. 11

    Androidビルドの失敗-java.lang.IllegalArgumentException:すでに追加されています:Lcom / google / api / client / escape / CharEscapers;

  12. 12

    onRequestPermissionsResult()のAndroid java.lang.IllegalStateException

  13. 13

    Android Kotlin:java.lang.IllegalStateException

  14. 14

    Androidのjava.lang.IllegalStateException

  15. 15

    原因:java.lang.IllegalStateException:ParsePluginsはすでに初期化されています

  16. 16

    java.lang.IllegalStateException:フラグメントがコンテキストにアタッチされていません

  17. 17

    java.lang.IllegalStateException:アクティビティにフラグメントがアタッチされていません

  18. 18

    応答はすでにコミットされています-java.lang.IllegalStateException:UT010019

  19. 19

    Android-java.lang.IllegalStateException:すでに閉じられているオブジェクトを再度開こうとします:SQLiteQuery:select * from table where rowid = 40495

  20. 20

    java.lang.IllegalStateExceptionが原因:デタッチされたフラグメントのViewModelProviderを作成できません

  21. 21

    androidフラグメントを使用したjava.lang.NullPointerException

  22. 22

    androidフラグメントjava.lang.nullpointerexception

  23. 23

    java.lang.IllegalStateException:setDoOutputですでに接続されています

  24. 24

    java.lang.IllegalStateException:setDoOutputですでに接続されています

  25. 25

    Ionic Androidビルド:java.lang.IllegalStateException:buildToolsVersionが指定されていません

  26. 26

    java.lang.IllegalStateExceptionの解決策はありますか:返信はすでに送信されています

  27. 27

    Androidフォアグラウンドサービスは常に「java.lang.IllegalArgumentException:サービスが登録されていません」という例外をスローします

  28. 28

    フラグメントのテスト:java.lang.RuntimeExceptionが発生し続けます:android.view.InflateException

  29. 29

    java.lang.IllegalStateException:すでに接続されています(Discord JDA)

ホットタグ

アーカイブ