AppCompactActivitry,FragmentActivity,Activity区别及主题样式设置

1.区别在哪
  1. import android.support.v7.app.AppCompatActivity;
  2. import android.os.Bundle;
  3. /*
  4. * support v4 FragmentActivity 兼容2.x模式下使用Fragment
  5. * support v7 AppCompatActivity 兼容2.x模式下使用Fragment和
  6. * ActionBar,ActionBarActivity是AppCompatActivity过时产品
  7. * 如果3.0以上直接继承Activity,便可使用Fragment和ActionBar
  8. */
  9. public class MainActivity extends AppCompatActivity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. }
  15. }
2.英文文档怎么说
  1. Activity is the base class of all other activities, I don't think it will be deprecated. 
  2. The relationship among them is:
  3. Activity <<<FragmentActivity <<< AppCompatActivity <<< ActionBarActivity
  4. '<<<' means inheritance(继承) here. The reference said ActionBarActivity is deprecated, 
  5. use AppCompatActivity instead.So basically, using AppCompatActivity is always the 
  6. right choise. The differences between them:
  7. Activity is the basic one.
  8. Based on Activity, FragmentActivity provides the ability to use Fragment.
  9. Based on FragmentActivity, AppCompatActivity provides features to ActionBar
3.说人话
  1. Activity 发展到3.0(大概)之后,可以使用fragment了,但是support v4 提供了1.6~3.0
  2. fragment兼容,所以如果需要用兼容版的fragment,则需要继承support v4提供的FragmentActivity
  3. 而后一点点时间之后,3.0(大概)出现的ActionBar也被向前支持了,这次是出现在support v7里,
  4. 如果需要使用兼容版的actionbar,则继承support v7提供的ActionBarActivity(它是继承
  5. FragmentActivity的)。
  6. 值得注意的是:
  7. 我们并不是要使用AppCompatActivity自带的标题栏,那样扩展会很麻烦,在14年的Android 5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。
4.在设置全屏问题的时候区别
设置全屏主要有两种方式:
(1).代码的形式
  1. 设置没有标题
  2. requestWindowFeature(Window.FEATURE_NO_TITLE);
  3. 设置全屏
  4. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
  5. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  6. -->注意
  7. 这两行代码必须设置在setcontentview前面
存在的问题:假设你现在继承的是AppcompactActivity的时候
首先来看一下我设置的样式:



继承Activity实现的效果如下


 
(2).在代码里面设置标题来改变AppcompactActivity的主题问题
第一步:在style文件中设置一个风格
  1. <style name="NoTitleFullscreen" parent="AppTheme">
  2. <item name="android:windowNoTitle">true</item>
  3. <item name="windowActionBar">false</item>
  4. <item name="android:windowFullscreen">true</item>
  5. <item name="android:windowContentOverlay">@null</item>
  6. </style>
第二步:在需要实现全屏的Activity中引入对应的主题
  1. <activity android:name=".ECLoginActivity" android:theme="@style/NoTitleFullscreen">
  2. <intent-filter>
  3. <action android:name="android.intent.action.MAIN"/>
  4. <category android:name="android.intent.category.LAUNCHER"/>
  5. </intent-filter>
  6. </activity>
第三步:你以为可以实现了,实际上并不是那样,接着会报出以下的一个异常
  1. Caused by: java.lang.IllegalArgumentException: AppCompat does not support 
  2. the current theme features: { windowActionBar: false, windowActionBarOverlay: 
  3. false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
我们来分析以下原因:

AppCompat对窗口主题的flag要求更严格。
主要原因是为了支持Dialog,大量使用了 AppCompat 之前并没有重视的 windowNoTitle 标志,升级到v22.1.0以后(包括本文讲述的22.1.1),你可能遇到上面的异常:

解决办法有两种:

  1. 最简单的是使用 Theme.AppCompat.NoActionBar 作为 parent theme,这样就会一直正常。
  2. 如果不能这样做(或许你需要同时支持ActionBarNoActionBar,其实也可以通过第一种方式来解决,
  3. 可能colorPrimary之类的需要多配置一遍),如下
  4. <style name="MyTheme" parent="Theme.AppCompat">
  5. ...
  6. </style>
  7. <style name="MyTheme.NoActionBar" parent="MyTheme">
  8. <!-- Both of these are needed -->
  9. <item name="windowActionBar">false</item>
  10. <item name="windowNoTitle">true</item>
  11. </style>
如下图所示:

最后:关于上图全局样式不生效的问题,目前我还没有找到很好的解决方式,如果是继承AppcompactActivity只能去引用style


 如果大家有什么好的解决方式可以提出来,大家一起探讨,文中有不对之处欢迎指出








阅读更多
换一批

没有更多推荐了,返回首页