您的位置:首页 > 移动开发

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

2017-06-11 15:48 211 查看
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



 如果大家有什么好的解决方式可以提出来,大家一起探讨,文中有不对之处欢迎指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: