2017-02-09 11 views
0

なぜAppCompatActivitygetFragmentManager()は、フラグメントマネージャのサポートバージョンを返しますか?代わりに、アクティビティをAppCompatActivityにする必要があります。具体的にはgetSupportFragmentManager()としてください。同じことが他の十数の方法にも当てはまります。それはあなた自身が呼び出すことができるメソッドと、 "サポート"バージョンとしてrebrandする必要があるメソッドを魔法のように熟知しなければならないということが私には不安です。 Androidの下位バージョンを引き続きサポートしている場合、「サポート」バージョンの代わりに「通常の」バージョンを呼びたいというユースケースはありますか? AppCompatActivityがそれ以降のAPIバージョンActivityと区別できないように機能していれば、それは私にはもっと意味をなさないでしょう。結局のところ、それはサポートされているのでしょうか?後のAPIバージョンActivityと同じ機能を提供しますか?AppCompatActivity design

デザイン原則や隠されたJavaの制限によって、そうすることができないのですか?

答えて

1

なぜAppCompatActivityのgetFragmentManager()は、フラグメントマネージャのサポートバージョンを返しませんか?

できません。

Activityは、APIレベル11+で、をandroid.app.FragmentManagerとして返します。 AppCompatActivityがオーバーライドできる唯一の方法は、オーバーライドされたメソッドでもandroid.app.FragmentManagerを返した場合です。それは可能ではありません。 AppCompatActivityは返されるandroid.app.FragmentManagerがないAPIレベル7に戻るように設計されています。したがって、getSupportFragmentManager()があり、android.support.v4.app.FragmentManagerが返されます。

AppCompactActivityは、APIレベル11の2年前にAPIレベル4に戻って動作するように設計されており、ネイティブフラグメントが実装されているFragmentActivityからフラグメントを実際に取得します。

+0

なぜ、サポートライブラリに独自のバージョンのandroid.app.FragmentManagerが定義されているのでしょうか? (私は、 "サポートバージョンは、後のAPIでネイティブバージョンと競合する"または "セキュリティ上の理由"のいずれかの理由を予測しますが、わかりません) – Erhannis

+0

@Erhannis: "サポートライブラリandroid.app.FragmentManagerの独自のバージョンを定義しますか? " - ライブラリを使用するアプリケーションがAPIレベル11以降でクラッシュし、 'android.app.FragmentManager'の実装が矛盾しているためです。 – CommonsWare

+0

Hmm。 ClassLoadersとリフレクションを使って周りに微妙なやり方がなかったら私は驚くだろうが、私はそれを残すだろう。もう一つの解決策は、AppCompatActivityとActivity11、あるいはどちらも、独自のバージョンのFragmentManagerでgetFragmentManager()を実装しているものの、Activityをサブクラス化してメソッドを追加することです。私はそのアプローチが好きだとは言えません。面倒なことに不安です。ファイン、私は歩く。ありがとう。私はまだ、すべての "サポート"方法が本当に好きではありません。それも、整頓されていません。 – Erhannis