AppCompactActivitry,FragmentActivity,Activity区别及主题样式设置
1.区别在哪




import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/*
* support v4 FragmentActivity 兼容2.x模式下使用Fragment
* support v7 AppCompatActivity 兼容2.x模式下使用Fragment和
* ActionBar,ActionBarActivity是AppCompatActivity过时产品
* 如果3.0以上直接继承Activity,便可使用Fragment和ActionBar
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2.英文文档怎么说
Activity is the base class of all other activities, I don't think it will be deprecated.
The relationship among them is:
Activity <<<FragmentActivity <<< AppCompatActivity <<< ActionBarActivity
'<<<' means inheritance(继承) here. The reference said ActionBarActivity is deprecated,
use AppCompatActivity instead.
So basically, using AppCompatActivity is always the- right choise. The differences between them:
Activity is the basic one.
Based on Activity, FragmentActivity provides the ability to use Fragment.
Based on FragmentActivity, AppCompatActivity provides features to ActionBar
3.说人话
Activity 发展到3.0(大概)之后,可以使用fragment了,但是support v4 提供了1.6~3.0的
fragment兼容,所以如果需要用兼容版的fragment,则需要继承support v4提供的FragmentActivity。
而后一点点时间之后,3.0(大概)出现的ActionBar也被向前支持了,这次是出现在support v7里,
如果需要使用兼容版的actionbar,则继承support v7提供的ActionBarActivity(它是继承
FragmentActivity的)。
- 值得注意的是:
- 我们并不是要使用AppCompatActivity自带的标题栏,那样扩展会很麻烦,在14年的Android 5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。
4.在设置全屏问题的时候区别
设置全屏主要有两种方式:
(1).代码的形式
设置没有标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
-->注意
这两行代码必须设置在setcontentview前面
存在的问题:假设你现在继承的是AppcompactActivity的时候
首先来看一下我设置的样式:
继承Activity实现的效果如下
(2).在代码里面设置标题来改变AppcompactActivity的主题问题
第一步:在style文件中设置一个风格
<style name="NoTitleFullscreen" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
第二步:在需要实现全屏的Activity中引入对应的主题
<activity android:name=".ECLoginActivity" android:theme="@style/NoTitleFullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
第三步:你以为可以实现了,实际上并不是那样,接着会报出以下的一个异常
Caused by: java.lang.IllegalArgumentException: AppCompat does not support
the current theme features: { windowActionBar: false, windowActionBarOverlay:
false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
我们来分析以下原因:
AppCompat对窗口主题的flag要求更严格。
主要原因是为了支持Dialog,大量使用了 AppCompat 之前并没有重视的 windowNoTitle 标志,升级到v22.1.0以后(包括本文讲述的22.1.1),你可能遇到上面的异常:
解决办法有两种:
最简单的是使用 Theme.AppCompat.NoActionBar 作为 parent theme,这样就会一直正常。
如果不能这样做(或许你需要同时支持ActionBar和NoActionBar,其实也可以通过第一种方式来解决,
可能colorPrimary之类的需要多配置一遍),如下
<style name="MyTheme" parent="Theme.AppCompat">
...
</style>
- <style name="MyTheme.NoActionBar" parent="MyTheme">
<!-- Both of these are needed -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
如下图所示:
最后:关于上图全局样式不生效的问题,目前我还没有找到很好的解决方式,如果是继承AppcompactActivity只能去引用style
如果大家有什么好的解决方式可以提出来,大家一起探讨,文中有不对之处欢迎指出