web-dev-qa-db-ja.com

nullオブジェクト参照で仮想メソッド「Android.os.Handler Android.support.v4.app.FragmentHostCallback.getHandler()」を呼び出してみてください

私のアプリケーションは、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ではありません!!

すべてのFragmentsライフサイクルが管理されており、アダプター内でnullの問題が発生していることに言及する必要があります。また、ActivityFragment !!!

19

多くの調査の結果、サポートライブラリの問題のようです。

構成変更時のフラグメントおよびViewPager crasheshのアクティビティ
Androidサポートライブラリの問題24.1.

私もこの答えを見つけましたが、コードにフラグを追加することは異常に見えます:

nullオブジェクトで仮想メソッド「Android.os.Handler Android.support.v4.app.FragmentHostCallback.getHandler()」を呼び出そうとしています

finishUpdateFragmentPagerAdapterメソッドをこのようにオーバーライドして、今のところ問題を解決しました!

@Override
public void finishUpdate(ViewGroup container) {
    try{
        super.finishUpdate(container);
    } catch (NullPointerException nullPointerException){
        System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
    }
}

より良い答えはありますか?私にお知らせください...

36

私はそれが遅れるかもしれないことを知っています、しかし、ここに私がすぐに見なかった私の愚かな間違いがあります:

@Override
public void onStop() {
    super.onDestroy(); //I was calling the wrong super
}
4
James

同じ問題がありました。私の場合、問題は、前回開いたときのアダプターに気付かずに再利用していたことでした。

私は、例外を送信する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();
}
3
user3884508

同じ問題があり、フラグメントの異なるインスタンスによるViewPagerインスタンスの再利用が原因でした。解決策は、フラグメントのonDestroyView()メソッドでアダプタをnullにすることでした。

@Override public void onDestroyView() {
    mViewPager.setAdapter(null);
    super.onDestroyView();
}

問題と解決策をデモするプロジェクト ここにあります

3

私のプロジェクトにも同じ問題があります。しかし、それは私のせいです。

[〜#〜]なぜ[〜#〜]

アクティビティがonDestroy()を呼び出した後、コールバックでonBackPressedを呼び出します。

OnDestroy()が呼び出された後、FragmentManagerのmHostインスタンスがnullに設定されるためです。

onBackPressedを呼び出すと、mHostインスタンスが再び使用されます。

1
Liu Tom
@Override
public void onBackPressed() {
//     super.onBackPressed();
       finish();
}  

アクティビティのonBackPressedをオーバーライドします。
スーパーコールを削除:super.onBackPressed
そして終了を呼び出します。

0
varunjohn1990

間違ったアクティビティ参照を使用してフェッチしていました

getSupportFragmentManager()

正しいアクティビティを使用すると、クラッシュが修正されました。

0
Varun Bhatia