Fragment和FragmentActivity有什么区别?

Ker*_*rry 156 android android-fragments android-fragmentactivity

我的问题是除了明显的继承差异之外,Fragment和之间的主要区别是FragmentActivity什么?每个班级最适合哪些场景?我试图理解为什么这两个类都存在......

Gun*_*son 277

A Fragment是一部分Activity,其中包含:

  • 它自己的生命周期
  • 收到自己的输入事件
  • 可以在Activity运行时添加或删除.

一个Fragment必须始终嵌入Activity.

Fragments不属于HoneyComb(3.0)之前的API.如果您想Fragments在面向HoneyComb之前的平台版本的应用中使用,您需要将支持包添加到您的项目中并使用它FragmentActivity来保存您的Fragments.本FragmentActivity类有处理的API Fragments,而Activity类,蜂窝状前向,其实不然.

如果您的项目仅针对HoneyComb或更新,那么您应该使用Activity而不是FragmentActivity保留您的Fragments.

一些细节:

使用android.app.FragmentActivity.使用android.support.v4.app.FragmentFragmentActivity.不要将支持包添加Fragment到a,Activity因为它会导致抛出异常.

需要注意的事项:FragmentManagerLoaderManager为FragmentActivity提供单独的支持版本:

如果您使用的FragmentActivity(HoneyComb及以上版本),请致电

  • getFragmentManager() 要得到 android.app.FragmentManager
  • getLoaderManager() 要得到 android.app.LoaderManager

如果你Fragment在a FragmentActivity(预HoneyComb)中使用a ,请致电:

  • getSupportFragmentManager()得到android.support.v4.app.FragmentManager.
  • getSupportLoaderManager() 要得到 android.support.v4.app.LoaderManager

所以,要这样做

//don't do this
myFragmentActivity.getLoaderManager(); 
//instead do this:
myFragmentActivity.getSupportLoaderManager();
Run Code Online (Sandbox Code Playgroud)

要么

//don't do this:
android.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager();
//instead do this:
android.support.v4.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager()
Run Code Online (Sandbox Code Playgroud)

同样有用的是,虽然片段必须嵌入其中,Activity但它不必是Activity布局的一部分.它可以用作活动的隐形工作者,没有自己的UI.

  • 但是,片段不需要是活动布局的一部分; 您也可以使用没有自己的UI的片段作为活动的隐形工作者. (6认同)
  • @Dhasneem如果您希望自己的应用适用于低于3.0的Android版本,可以将片段添加到FragmentActivity中.否则,您将片段添加到活动. (2认同)
  • 谢谢!这解决了我的问题!现在我知道为什么我的应用程序(用Activity编写)在添加Facebook登录按钮后总是在onCreate崩溃(他们在他们的例子中使用android.support.v4.app.Fragment).当然还有其他原因导致崩溃.但你的答案是将它们组合在一起的最后一块. (2认同)

Gök*_*ker 14

FragmentActivity是我们经典的Activity,支持片段,仅此而已.因此,当Fragment将附加到Activity时,需要FragmentActivity.

Well Fragment是复制Activity的基本行为的好组件,仍然不是像Activity这样的独立应用程序组件,需要附加到Activity才能工作.

这里了解更多详情


j2e*_*nue 8

将FragmentActivity视为可以支持Fragments的常规Activity类.在蜂窝之前,活动类不能直接使用片段,因此在使用片段的活动中需要这样做.

如果你的目标发行版是Honeycomb,那么你可以延伸到Activity.

片段也被视为"子活动".没有活动就不可能存在.总是将片段视为子活动,你应该做得很好.因此,活动将是父类,而片段是子类的符号关系.