web-dev-qa-db-ja.com

android.support.v4.app.getFragmentManager()はnullを返しますか?

これは私のStacktraceです:

FATAL EXCEPTION: main
Java.lang.NullPointerException
at com.example.test.fragments.LoadingFragment$1.run(LoadingFragment.Java:66)
at Android.os.Handler.handleCallback(Handler.Java:725)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:5041)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
at dalvik.system.NativeStart.main(Native Method)

私のフラグメントの行66:

FragmentTransaction ft = fm.beginTransaction();

fmは次のようになります。

Android.support.v4.app.FragmentManager fm = getFragmentManager();

私のフラグメントはAndroid.support.v4.app.Fragment、これらは私のインポートです:

import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentTransaction;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;

fragmentManagerがnullになったのを見たことがありませんでした。

30
Yalla T.

このgetFragmentManager()をこのgetSupportFragmentManager()に置き換え、アクティビティがFragmentActivityを拡張することも確認してください

83
Pragnani

_Android.support.v4.app.Fragment_ソースから:

_// The fragment manager we are associated with.  Set as soon as the
// fragment is used in a transaction; cleared after it has been removed
// from all transactions.
FragmentManagerImpl mFragmentManager;
_

どうやらgetFragmentManager()はフラグメントマネージャーのサポートバージョンを返しますが、トランザクション中(または親フラグメントの子フラグメントマネージャー)にのみです。

これを使用します。

_public FragmentManager getHostFragmentManager() {
    FragmentManager fm = getFragmentManager();
    if (fm == null && isAdded()) {
        fm = ((AppCompatActivity)getActivity()).getSupportFragmentManager();
    }
    return fm;
}
_
3
Eugen Pechanec

ケース:別のFragment(Parent Fragment)からFragment(Child fragment)を呼び出す必要がある場合

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

0
Vishnu Magar