Android中Activity与AppCompatActivity的理解

不知道大家有没有发现,当使用Eclipse开发Android应用的时候,当创建项目的时候,MainActivity自动继承的是Activity,而在使用Android Studio开发Android应用的时候,创建项目时,自动继承的是AppCompatActivity。我们分别用Eclipse与AS创建项目并运行,发现继承的父类不一样,但是运行出来的界面是一样的,如下图所示:



大家可以看到在界面最上面会出现一个ActionBar,默认显示项目的名称Toolbar。下面我们将AS项目中的父类AppCompatActivity手动替换成Activity试试看。


  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. }
  7. }
修改AppCompatActivity为Activity,并导入相应的包。这样我们的项目代码在Eclipse与AS的就保持一致了,运行一下看看效果。


程序运行后,大家可以发现顶部的ActionBar不见了,代码中都是继承Activity的,但是运行出来的界面确不一样,所以在AS中创建项目的时候,自动继承的是AppCompatActivity。


ActionBar向前 兼容,出现在support v7里,如果需要使用兼容版的actionbar,则继承support v7提供的ActionBarActivity(它是继承FragmentActivity的)。当推出Android 5.0之后,提供了很多很多新东西,于是support v7也更新了,出现了AppCompatActivity。 AppCompatActivity是用来替代ActionBarActivity的,如果当你把代码中的父类改为ActionBarActivity时,会发现提示已经过时。



复制代码
package com.chy.myapplication;
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);
    }
}
复制代码

 

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的)。
再然后也就是去年年底到今年,5.0提供了很多很多新东西,于是support v7也更新了,出现了AppCompatActivity , 具体功能请自行查找。

================================================================================================================================================================
以下内容来自Googlehttp://stackoverflow.com/questions/31297246/activity-appcompatactivity-fragmentactivity-and-actionbaractivity-when-tous

 =======================================================================================================================================

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 ActivityFragmentActivity provides the ability to use Fragment.
  • Based on FragmentActivityAppCompatActivity provides features to ActionBar

AppCompatActivity与toolbar的结合,BaseActivity简单封装

Android 5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中

一个应用的几乎所有界面都需要头部app bar,为了能够方便各个界面方便使用,统一管理,这里就来对toolBar进行简单的封装。

先上两张图:



1,定义一个toolbar_layout.xml文件,封装toolbar,其他界面需要用,只要include进来就可以了,
自定义返回按钮(navigation),标题(Title),副标题(subTitle)
toolbar默认的title在头部的左边,由于toolbar是ViewGroup的子类,它就是个容器,这里我们自定义一个title,subTitle,定义两个TextView
放在ToolBar控件中,布局如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v7.widget.Toolbar
  3. xmlns:android= "http://schemas.android.com/apk/res/android"
  4. android:id= "@+id/toolbar"
  5. android:layout_width= "match_parent"
  6. android:layout_height= "wrap_content"
  7. android:background= "@color/colorPrimary"
  8. android:minHeight= "?attr/actionBarSize">
  9. <!--自定义toolbar的title 和subtitle -->
  10. <TextView
  11. android:id= "@+id/toolbar_subtitle"
  12. style= "@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle"
  13. android:layout_width= "wrap_content"
  14. android:layout_height= "wrap_content"
  15. android:singleLine= "true"
  16. android:textColor= "@color/white"
  17. android:text= "subtitle"
  18. android:paddingRight= "10dp"
  19. android:layout_gravity= "right" />
  20. <TextView
  21. android:id= "@+id/toolbar_title"
  22. style= "@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
  23. android:layout_width= "wrap_content"
  24. android:layout_height= "wrap_content"
  25. android:lines= "1"
  26. android:ellipsize= "end"
  27. android:text= "title"
  28. android:scrollHorizontally= "true"
  29. android:textColor= "@color/white"
  30. android:layout_gravity= "center" />
  31. </android.support.v7.widget.Toolbar>


2,我们知道在AndroidManifest.xml清单文件下application中设置了android:theme="@style/AppTheme"而查看AppTheme看到如下样式
  1. <resources>
  2. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  3. </style>
  4. </resources>

从名字我们就可以看出来,默认的标题栏为黑色。我们使用了toolbar就必须修改样式文件,将原来的标题栏去掉,修改后的样式文件如下:

  1. <style name="AppTheme" parent="AppTheme.Base">
  2. </style>
  3. <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
  4. <item name="colorPrimary">@color/colorPrimary </item>
  5. <item name="colorPrimaryDark">@color/colorPrimaryDark </item>
  6. <item name="colorAccent">@color/colorAccent </item>
  7. </style>

实际上就是设置没有标题,无actionBar主题
  1. <style name="Theme.AppCompat.Light.NoActionBar">
  2. <item name="windowActionBar">false </item>
  3. <item name="windowNoTitle">true </item>
  4. </style>

为了支持5.0的手机,需要建立一个文件夹values-v21,再新建style.xml文件,设置
  1. <style name="AppTheme" parent="AppTheme.Base">
  2. </style>

3,封装一个基类,BaseAppCompatActivity,里面实现toolBar的封装,注释已经写的很详细了,代码如下:

  1. package com.hdc.toolbardemo;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.support.v7.widget.Toolbar;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.widget.TextView;
  8. /**
  9. * Created by wk on 2016/7/7.
  10. * Base Activity.
  11. */
  12. public abstract class BaseAppCompatActivity extends AppCompatActivity {
  13. private static final String TAG = BaseAppCompatActivity.class.getSimpleName();
  14. private TextView mToolbarTitle;
  15. private TextView mToolbarSubTitle;
  16. private Toolbar mToolbar;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(getLayoutId());
  21. mToolbar = (Toolbar) findViewById(R.id.toolbar);
  22. /*
  23. toolbar.setLogo(R.mipmap.ic_launcher);
  24. toolbar.setTitle("Title");
  25. toolbar.setSubtitle("Sub Title");
  26. */
  27. mToolbarTitle = (TextView) findViewById(R.id.toolbar_title);
  28. mToolbarSubTitle = (TextView) findViewById(R.id.toolbar_subtitle);
  29. if (mToolbar != null) {
  30. //将Toolbar显示到界面
  31. setSupportActionBar(mToolbar);
  32. }
  33. if (mToolbarTitle != null) {
  34. //getTitle()的值是activity的android:lable属性值
  35. mToolbarTitle.setText(getTitle());
  36. //设置默认的标题不显示
  37. getSupportActionBar().setDisplayShowTitleEnabled( false);
  38. }
  39. }
  40. @Override
  41. protected void onStart() {
  42. super.onStart();
  43. /**
  44. * 判断是否有Toolbar,并默认显示返回按钮
  45. */
  46. if( null != getToolbar() && isShowBacking()){
  47. showBack();
  48. }
  49. }
  50. /**
  51. * 获取头部标题的TextView
  52. * @return
  53. */
  54. public TextView getToolbarTitle(){
  55. return mToolbarTitle;
  56. }
  57. /**
  58. * 获取头部标题的TextView
  59. * @return
  60. */
  61. public TextView getSubTitle(){
  62. return mToolbarSubTitle;
  63. }
  64. /**
  65. * 设置头部标题
  66. * @param title
  67. */
  68. public void setToolBarTitle(CharSequence title) {
  69. if(mToolbarTitle != null){
  70. mToolbarTitle.setText(title);
  71. } else{
  72. getToolbar().setTitle(title);
  73. setSupportActionBar(getToolbar());
  74. }
  75. }
  76. /**
  77. * this Activity of tool bar.
  78. * 获取头部.
  79. * @return support.v7.widget.Toolbar.
  80. */
  81. public Toolbar getToolbar() {
  82. return (Toolbar) findViewById(R.id.toolbar);
  83. }
  84. /**
  85. * 版本号小于21的后退按钮图片
  86. */
  87. private void showBack(){
  88. //setNavigationIcon必须在setSupportActionBar(toolbar);方法后面加入
  89. getToolbar().setNavigationIcon(R.mipmap.icon_back);
  90. getToolbar().setNavigationOnClickListener( new View.OnClickListener() {
  91. @Override
  92. public void onClick(View v) {
  93. onBackPressed();
  94. }
  95. });
  96. }
  97. /**
  98. * 是否显示后退按钮,默认显示,可在子类重写该方法.
  99. * @return
  100. */
  101. protected boolean isShowBacking(){
  102. return true;
  103. }
  104. /**
  105. * this activity layout res
  106. * 设置layout布局,在子类重写该方法.
  107. * @return res layout xml id
  108. */
  109. protected abstract int getLayoutId();
  110. @Override
  111. protected void onDestroy() {
  112. super.onDestroy();
  113. Log.v(TAG, "onDestroy...");
  114. }
  115. }

4,这样就基本把boolbar封装好了,在其他Activity中就可以方便使用了
如,在MainActivity.java中,继承BaseAppCompatActivity,复写getLayoutId()方法,设置布局文件,在布局文件中把toolbar_layout文件include进来
< include layout="@layout/toolbar_layout"/>,一句话就包含了toolbar,很方便,
复写isShowBacking()方法,设置是否显示返回按钮,默认显示不需复写.getToolbarTitle().setText("主界面");getSubTitle().setText("更多");调用这两个方法就可以设置标题和副标题,其他页面也是一样很方便的调用
  1. package com.hdc.toolbardemo;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.view.Menu;
  5. import android.view.MenuItem;
  6. import android.view.View;
  7. import android.widget.Toast;
  8. public class MainActivity extends BaseAppCompatActivity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. getToolbarTitle().setText( "主界面");
  13. getSubTitle().setText( "更多");
  14. }
  15. /**
  16. * 设置不显示返回按钮
  17. *
  18. * @return
  19. */
  20. protected boolean isShowBacking() {
  21. return false;
  22. }
  23. /**
  24. * 设置布局
  25. *
  26. * @return
  27. */
  28. @Override
  29. protected int getLayoutId() {
  30. return R.layout.activity_main;
  31. }
  32. /**
  33. * 跳转到登录界面
  34. *
  35. * @param view
  36. */
  37. public void login(View view) {
  38. Intent intent = new Intent( this, LoginActivity.class);
  39. startActivity(intent);
  40. }
  41. @Override
  42. public boolean onCreateOptionsMenu(Menu menu) {
  43. // Inflate the menu; this adds items to the action bar if it is present.
  44. getMenuInflater().inflate(R.menu.menu_main, menu);
  45. return true;
  46. }
  47. @Override
  48. public boolean onOptionsItemSelected(MenuItem item) {
  49. // TODO Auto-generated method stub
  50. switch(item.getItemId()){
  51. case R.id.menu_about:
  52. Toast.makeText(MainActivity. this, ""+ "关于", Toast.LENGTH_SHORT).show();
  53. break;
  54. case R.id.menu_settings:
  55. Toast.makeText(MainActivity. this, ""+ "设置", Toast.LENGTH_SHORT).show();
  56. break;
  57. case R.id.menu_quit:
  58. Toast.makeText(MainActivity. this, ""+ "退出", Toast.LENGTH_SHORT).show();
  59. break;
  60. default:
  61. break;
  62. }
  63. return super.onOptionsItemSelected(item);
  64. }
  65. }

源码下载地址,点击 这里。。。

参考资料:

android:ToolBar详解(手把手教程)
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html


Android设置Toolbar的标题居中:
http://dastorm.com/2015/05/31/android%E8%AE%BE%E7%BD%AEtoolbar%E7%9A%84%E6%A0%87%E9%A2%98%E5%B1%85%E4%B8%AD/


Activity之AppCompatActivity与toolbar的结合

http://www.myexception.cn/android/2053784.html


Android 5.x Theme 与 ToolBar 实战

http://blog.csdn.net/lmj623565791/article/details/45303349

猜你喜欢

转载自blog.csdn.net/andrewniu/article/details/81017967
今日推荐