8

コンテキスト:Activity aFragmentと3がありInnerFragmentsます。が呼び出されたら、Fragment onDestroy()から内部フラグメントを削除したいと思いFragmentManagerます。からのコードonDestroy()は以下のとおりです。

問題: おそらくが呼び出されたときにFragmentManagerスローします。理由がわかりません。NullPointerExceptioncommitAllowingStateLoss()

@Override
public void onDestroy()
{
    super.onDestroy();
    if (getFragmentManager().findFragmentById(R.id.fragment_framelayout_left) != null)
    {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.remove(mLeftFragment);
        fragmentTransaction.commitAllowingStateLoss();
    }
}

スタックトレース:

02-11 12:15:14.162: E/AndroidRuntime(25911): FATAL EXCEPTION: main
02-11 12:15:14.162: E/AndroidRuntime(25911): java.lang.NullPointerException
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1419)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Handler.handleCallback(Handler.java:725)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.os.Looper.loop(Looper.java:137)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at android.app.ActivityThread.main(ActivityThread.java:5039)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at java.lang.reflect.Method.invokeNative(Native Method)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at java.lang.reflect.Method.invoke(Method.java:511)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-11 12:15:14.162: E/AndroidRuntime(25911):    at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

9

FragmentManager管理者はすべてFragmentsをレベルで管理し、そのActivityライフサイクルはその親に関連付けられActivityます。子FragmentマネージャーはすべてFragmentsFragmentレベルで管理し、そのライフサイクルはその親に関連付けられFragmentます。

したがって、電話のアーキテクチャについては、を使用してに追加InnerFragmentしてください。(戻るボタン/を介して)永久に破壊すると、は破壊されて解放されます。ActivitygetFragmentManager()Activityfinish()FragmentManagerInnerFragment

タブレットアーキテクチャの場合は、(最新のサポートライブラリで)を使用するように追加InnerFragmentsします。が永久に破壊されると、意志はあなたのためにを破壊して解放します。FragmentgetChildFragmentManager()FragmentFragmentManagerInnerFragments

あなたは自分自身を解放し破壊することを管理する必要はないはずFragmentsです。あなたのライフサイクルイベントをログに記録することをお勧めします。ActivitiesそうFragmentsすれば、それらが状態を通過し、正しい動作を保証できるようになります。

于 2013-02-12T14:20:16.833 に答える
1

NullPointerExceptionは、アクティビティのハンドラーがFragmentManagerから設定されていないために発生するため、クラッシュを防ぐ「解決策」は次のとおりです。

public void onDestroy(){
        super.onDestroy();
        try {
            Field mActivityField = getFragmentManager().getClass().getDeclaredField("mActivity");
            mActivityField.setAccessible(true);
            mActivityField.set(getFragmentManager(), this);

            Field mPendingActionsField = getFragmentManager().getClass().getDeclaredField("mPendingActions");
            mPendingActionsField.setAccessible(true);
            mPendingActionsField.set(getFragmentManager(), null);


            Field f = Activity.class.getDeclaredField("mHandler");
            f.setAccessible(true);
            Handler handler = (Handler) f.get(this);
            handler.close();
        } catch (Throwable e) {

        }
}
于 2015-07-09T09:34:56.150 に答える
0

ケース:別のフラグメント(親フラグメント)からフラグメント(子フラグメント)を呼び出す必要がある場合

親フラグメント内ではgetChildFragmentManager()なく、常に使用してください。getFragmentManager

ドキュメントを読む

于 2019-06-24T06:08:49.813 に答える