2017-02-09 36 views
0

为什么AppCompatActivitygetFragmentManager()返回片段管理器的支持版本?相反,您必须同时让您的活动为AppCompatActivity,并特别呼叫getSupportFragmentManager()。其他十几种方法也是如此。它让我感到奇怪,你必须神奇地知道你可以称为自己的哪些方法,以及哪些方法需要重新命名为“支持”版本。当你仍然支持较低版本的Android时,是否还有任何需要调用“正常”版本而不是“支持”版本的用例?如果AppCompatActivityActivity的后续API版本无法区别地运行,那么对我而言会更有意义 - 毕竟,这就是它所支持的,不是吗?提供与Activity的后续API版本相同的功能?AppCompatActivity设计

是否有某种设计原则或隐藏的Java限制阻止他们这样做?

回答

1

为什么AppCompatActivity的getFragmentManager()返回片段管理器的支持版本?

因为它不能。

Activity,在API级别11+上,将getFragmentManager()定义为返回android.app.FragmentManagerAppCompatActivity可以覆盖它的唯一方法是如果重写的方法返回android.app.FragmentManager。这是不可能的。 AppCompatActivity旨在回到API级别7,其中没有android.app.FragmentManager返回。因此,我们有getSupportFragmentManager(),返回android.support.v4.app.FragmentManager

请注意,AppCompactActivity确实从FragmentActivity获得了片段,该片段旨在回溯到API Level 4,这是API Level 11和本机片段实施前的两年。

+0

为什么不,例如,有支持库定义他们自己的'android.app.FragmentManager'版本? (我预测了“那么支持版本会与后来的API中的本地版本冲突”或“安全原因”)的原因,但我不确定) – Erhannis

+0

@Erhannis:“例如,为什么不支持支持库定义他们自己的android.app.FragmentManager版本?“ - 因为那时使用该库的应用程序在API Level 11+上崩溃,而android.app.FragmentManager的实现发生冲突。 – CommonsWare

+0

嗯。如果在ClassLoaders和反射方面没有一些棘手的方法,我会感到惊讶,但我会留下这个。另一种解决方案发生在我身上的将是他们具有子类别的活动,而不是添加方法,所以AppCompatActivity和Activity11或任何都实现了getFragmentManager()与他们自己的版本的FragmentManager。尽管如此,我不能说我喜欢那种方式。烦人的不整洁。好,我屈服;谢谢。尽管如此,我仍然不太喜欢所有的“支持”方法;它也是不整洁的。 – Erhannis