AndroidFragmentsデモにはバグがあるはずだと私には思えます。
背景として、フラグメントはAndroid OSによってインスタンス化されることがあるため、パブリックの引数なしコンストラクターが必要です。
Fragmentのすべてのサブクラスには、パブリックの空のコンストラクターが含まれている必要があります。フレームワークは、必要に応じて、特に状態の復元中にフラグメントクラスを再インスタンス化することが多く、インスタンス化するためにこのコンストラクターを見つけることができる必要があります。空のコンストラクターが使用できない場合、状態の復元中に実行時例外が発生する場合があります。
ただし、フラグメントに関する公式のAndroidトレーニングのNewsReaderデモHeadlinesFragment
は、クラスを作成し、setOnHeadlineSelectedListener(this)
fromを使用して構成しますNewsReaderActivity.onCreate()
。
Android OSがこのフラグメントを再インスタンス化する場合、その状態を保存または復元しないmHeadlineSelectedListener
ため、フィールドはnullになります。HeadlinesFragment
とにかくそれはできません。なぜなら、への参照を永続化することは不可能だと私は信じているからActivity
です。
さらに、Fragment
ドキュメントには次のように記載されていることに気づきました。
フラグメントが再インスタンス化されるときにこれらのコンストラクターが呼び出されないため、サブクラスにパラメーターを持つ他のコンストラクターを持たないことを強くお勧めします。代わりに、引数はsetArguments(Bundle)を使用して呼び出し元によって提供され、後でgetArguments()を使用してFragmentによって取得されます。
一方、前のFragmentBasics
例では、インスタンス化と構成(一種)が正しく実行されているようです。デモで行われているように、何らかの理由HeadlinesFragment
で、を介してではなく直接インスタンス化するため、「一種の」と言います。とにかく、彼らはからセッターを呼び出すという明らかな間違いを犯しませんが、代わりに、の間にそうする場所を見つける責任を負わせます。SupportFragmentManager
NewsReader
HeadlinesFragment
MainActivity
HeadlinesFragment
OnArticleSelectedListener
onAttach()
これは例のバグNewsReader
ですか、それとも何かが足りませんか?それまでの間、 Androidのドキュメントの問題を提出しました。