web-dev-qa-db-ja.com

AndroidXアプリケーションへの移行後、null参照でandroidx.fragment.app.FragmentManagerImpl.isDestroyed()を呼び出そうとするとクラッシュする

完全なスタックにはAndroidコアコードのみが含まれます:

Java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
    at androidx.fragment.app.Fragment.performDetach(Fragment.Java:2844)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.Java:1033)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.Java:1237)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.Java:434)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.Java:2075)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.Java:1865)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.Java:1820)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.Java:1726)
    at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.Java:150)
    at Android.os.Handler.handleCallback(Handler.Java:873)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:193)
    at Android.app.ActivityThread.main(ActivityThread.Java:6669)
    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:858)

メインアクティビティでフラグメントを置き換えると発生します。

Runnable mPendingRunnable = new Runnable() {
            @Override
            public void run() {
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment);
                fragmentTransaction.commitAllowingStateLoss();
            }
        };
8
Mircea Slimu

これを引き起こしているmyFragment.onDetachのコードの一部を見つけました:

ViewPagerでタブを使用するとエラー「Java.lang.IllegalStateExceptionアクティビティが破棄されました」が表示される)の回避策でした

        try {
            Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

現在、androidxでは、この回避策は必要ありません。

35
Mircea Slimu

私のモジュールのgradleで、元に戻すことで修正しました

implementation 'androidx.appcompat:appcompat:1.1.0-beta01'

implementation 'androidx.appcompat:appcompat:1.1.0-alpha05'

(childFragmentManagerに関する上記の回答は役に立ちませんでした。)

5
S Fitz

私はこの問題について過去1日間ひどく悩んでいました、そして最後に私は解決策を見つけました。ここで私はgradleを使用しています

implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

そして、このコードを使用してフラグメントを置き換えました。

 getActivity().getSupportFragmentManager().beginTransaction().detach(new    KiKorbo()).replace(R.id.calendar1, caldroidFragment).attach(caldroidFragment)
            .addToBackStack(null).commit();

ここで、KiKorbo.Javaは私の親フラグメントであり、caldroidFragmentを置き換えました。

1
pavel