我来自iOS,它很简单,你只需要使用UIViewController。然而,在Android中,事情似乎要复杂得多,特定的API级别有特定的uiccomponent。我正在阅读BigNerdRanch for Android(这本书大约有2年的历史了),他们建议我使用Activity来托管我的FragmentActivities。然而,我认为活动是不赞成的。
那么对于API级别22(至少支持API级别15或16),我究竟应该使用什么来托管组件,以及组件本身呢?所有这些都有用处吗,还是我应该只使用其中一两个?
2019:使用AppCompatActivity
在写这篇文章的时候(检查链接确认它仍然是正确的),Android文档建议使用AppCompatActivity如果你正在使用应用程序栏。
这是给定的理性:
Beginning with Android 3.0 (API level 11), all activities that use
the default theme have an ActionBar as an app bar. However, app bar
features have gradually been added to the native ActionBar over
various Android releases. As a result, the native ActionBar behaves
differently depending on what version of the Android system a device
may be using. By contrast, the most recent features are added to the
support library's version of Toolbar, and they are available on any
device that can use the support library.
For this reason, you should use the support library's Toolbar class to
implement your activities' app bars. Using the support library's
toolbar helps ensure that your app will have consistent behavior
across the widest range of devices. For example, the Toolbar widget
provides a material design experience on devices running Android 2.1
(API level 7) or later, but the native action bar doesn't support
material design unless the device is running Android 5.0 (API level
21) or later.
添加工具栏的一般方向是
添加v7版appcompat支持库
让你所有的活动扩展AppCompatActivity
在Manifest中声明你想要NoActionBar。
在每个活动的xml布局中添加一个工具栏。
在每个活动的onCreate中获取工具栏。
有关详细信息,请参阅文档说明。它们很清楚,很有帮助。
Activity是所有其他Activity的基类,我不认为它会被弃用。它们之间的关系是:
Activity <- FragmentActivity <- AppCompatActivity <- ActionBarActivity
'<-'在这里表示继承。参考说ActionBarActivity已弃用,改用AppCompatActivity。
所以基本上,使用AppCompatActivity总是正确的选择。它们之间的区别是:
活动是最基本的。
基于Activity, FragmentActivity提供了使用Fragment的能力。
基于FragmentActivity, AppCompatActivity为ActionBar提供了一些特性。
我以为Activity被弃用了
No.
那么对于API级别22(至少支持API级别15或16),我究竟应该使用什么来托管组件,以及组件本身呢?所有这些都有用处吗,还是我应该只使用其中一两个?
活动是基线。每个activity都直接或间接地继承自activity。
FragmentActivity用于在support-v4和support-v13库中找到的片段的后端口。片段的本机实现是在API级别11中添加的,这比您建议的minSdkVersion值要低。需要特别考虑FragmentActivity的唯一原因是如果您想使用嵌套片段(一个片段包含另一个片段),因为在API级别17之前,原生片段不支持嵌套片段。
AppCompatActivity来自appcompat-v7库。主要来说,这提供了一个操作栏的后端口。由于本机操作栏是在API Level 11中添加的,因此不需要AppCompatActivity。然而,当前版本的appcompat-v7还在操作栏和各种小部件方面增加了材料设计美学的有限后端口。使用appcompat-v7有优点和缺点,这远远超出了这个特定的Stack Overflow答案的范围。
ActionBarActivity是appcompat-v7中基本活动的旧名称。由于种种原因,他们想要改名。除非你使用的第三方库坚持使用ActionBarActivity,否则你应该更喜欢AppCompatActivity而不是ActionBarActivity。
因此,给定你的minSdkVersion在15-16范围内:
如果你想要反向移植的材质设计外观,请使用AppCompatActivity
如果不是,但你想要嵌套的片段,使用FragmentActivity
如果没有,使用Activity
AppCompatActivity扩展FragmentActivity,所以任何需要使用FragmentActivity特性的人都可以使用AppCompatActivity。
对于最低API级别为15的情况,您需要使用AppCompatActivity。例如,你的MainActivity看起来是这样的:
public class MainActivity extends AppCompatActivity {
....
....
}
要使用AppCompatActivity,请确保您下载了谷歌支持库(您可以在您的Tools -> Android -> SDK管理器中检查这一点)。然后在你的应用的gradle中包含gradle依赖。构建文件:
compile 'com.android.support:appcompat-v7:22:2.0'
你可以使用这个AppCompat作为你的主活动,然后它可以用来启动Fragments或其他活动(这取决于你正在构建的应用类型)。
《BigNerdRanch》这本书是一个很好的资源,但是是的,它已经过时了。阅读它可以获得关于Android如何工作的一般信息,但不要期望他们使用的特定类是最新的。