:getView()がnullの場合、つまりonCreateView()の前またはonDestroyView()の後では、フラグメントビューのLifecycleOwnerにアクセスできません。


8

アプリケーションのすべてのネットワーク呼び出しと応答処理にライブデータを使用しています。

シナリオの1つでは、私のリサイクラービューがビューホルダーのデータをロードonBindし、応答がUIを更新しています。そのためにはlifecycleOwner、オブザーバーにを提供する必要があります。

リサイクラービューには独自のライフサイクルオーナーがないため、親フラグメントを使用して使用してparentFragment.viewlifecycleOwnerいますが、どういうわけかエラーが発生します。

親フラグメントにインスタンスがない場合、ビューホルダーはどのようにインスタンスを持つことができますか?

viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
    updateUI(it)
})

致命的な例外:java.lang.IllegalStateException:getView()がnullの場合、つまりonCreateView()の前またはonDestroyView()の後では、フラグメントビューのLifecycleOwnerにアクセスできません。


1
問題は、私のViewHolderがサーバーから一部のデータをフェッチしていて、応答が受信された後、ホルダーの実際のデータが作成され、親フラグメントのライフサイクルオーナーを使用してアタッチされたオブザーバーが再び存在することでした。しかし、ビューホルダーがデータをフェッチしているときにフラグメントから移動すると、親フラグメントビューが破棄され、ビューホルダーが応答を取得してオブザーバーを親フラグメントのライフサイクルオーナーにアタッチしようとすると、上記のエラーがスローされます。親フラグメントを残したビューはありませんでした。
Utkarsh Singh

回答:


0

私のためのソリューションは簡素化されました。私は別のオブザーバーを使用しています。1つはメインアクティビティ(または任意のアクティビティのみ)からLifecycleownerを使用しているネットワーク用で、もう1つはフラグメントビュー(モデルビュービューモデル)用です。


0

getViewLifecycleOwner( )のドキュメント、私は考えていない、私はより良い説明することができます:

ビューのライフサイクルに安全にアクセスできる最初のメソッドは、null以外のビューを返す必要があるという条件の下でonCreateView(LayoutInflater、ViewGroup、Bundle)です(ビューのライフサイクルにアクセスしても返さない場合はIllegalStateExceptionがスローされます) null以外のビュー)。

ビューのライフサイクルは、onDestroyView()の呼び出しを通じて有効なままです。その後、getView()はnullを返し、ビューのライフサイクルは破棄され、このメソッドはIllegalStateExceptionをスローします。getViewLifecycleOwnerLiveData()またはFragmentTransaction.runOnCommit(Runnable)を使用して、フラグメントのビューライフサイクルが利用可能な場合のコールバックを受け取ることを検討してください。

public LifecycleOwner getViewLifecycleOwner() {
    if (mViewLifecycleOwner == null) {
        throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
                + "getView() is null i.e., before onCreateView() or after onDestroyView()");
    }
    return mViewLifecycleOwner;
}

-1

コメントとしての解決策は、フラグメントのビューがnullにならないようにすることです。これは、ViewPager内のFragmentで発生しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.