私のアプリケーションは、FragmentPagerAdapter
を使用して親フラグメント内にロードされるタブとしての4つのフラグメントで構成されます。
問題は、アプリを実行してから押してアプリを再度開くと、このエラーログが表示されることです。
FATAL EXCEPTION: main
Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.os.Handler Android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
at Android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.Java:1949)
at Android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.Java:1965)
at Android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.Java:620)
at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:143)
at Android.support.v4.view.ViewPager.setAdapter(ViewPager.Java:513)
...
親フラグメント内のコード行は次のとおりです。
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
およびViewPage
およびAdapter
は両方ともnullではありません!!
すべてのFragment
sライフサイクルが管理されており、アダプター内でnullの問題が発生していることに言及する必要があります。また、Activity
をFragment
!!!
多くの調査の結果、サポートライブラリの問題のようです。
構成変更時のフラグメントおよびViewPager crasheshのアクティビティ
Androidサポートライブラリの問題24.1.
私もこの答えを見つけましたが、コードにフラグを追加することは異常に見えます:
finishUpdate
のFragmentPagerAdapter
メソッドをこのようにオーバーライドして、今のところ問題を解決しました!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
より良い答えはありますか?私にお知らせください...
私はそれが遅れるかもしれないことを知っています、しかし、ここに私がすぐに見なかった私の愚かな間違いがあります:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
同じ問題がありました。私の場合、問題は、前回開いたときのアダプターに気付かずに再利用していたことでした。
私は、例外を送信するFragmentManager.Javaクラスを調べましたが、クラッシュするのとまったく同じ行で、「フラグメントホストのメインスレッドから呼び出す必要があります」と述べています。
私のコードは:
PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager());
viewPager.setAdapter(adapter);
pageAdapterをブリッジとして使用してフラグメント間の通信を行っていたため、シングルトンパターンを使用しました。それは私にとってはうまくいきましたが、別のアクティビティでこの構造を繰り返すと、同じ例外が発生しました。そして、その理由は、使用するたびにアダプタークラスのシングルトンを破棄するのを忘れたことです。
@Override
protected void onDestroy() {
MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null;
super.onDestroy();
}
同じ問題があり、フラグメントの異なるインスタンスによるViewPager
インスタンスの再利用が原因でした。解決策は、フラグメントのonDestroyView()
メソッドでアダプタをnullにすることでした。
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
問題と解決策をデモするプロジェクト ここにあります 。
私のプロジェクトにも同じ問題があります。しかし、それは私のせいです。
[〜#〜]なぜ[〜#〜]
アクティビティがonDestroy()を呼び出した後、コールバックでonBackPressedを呼び出します。
OnDestroy()が呼び出された後、FragmentManagerのmHostインスタンスがnullに設定されるためです。
onBackPressedを呼び出すと、mHostインスタンスが再び使用されます。
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
アクティビティのonBackPressed
をオーバーライドします。
スーパーコールを削除:super.onBackPressed
そして終了を呼び出します。
間違ったアクティビティ参照を使用してフェッチしていました
getSupportFragmentManager()
正しいアクティビティを使用すると、クラッシュが修正されました。