- 支持包更新到22.1之后,Android Studio项目的Activity默认继承这个类。
- ActionBarActivity已替代ActionBarActivity
这并不只是命名的改变,内部实现原理其实是通过AppCompatDelegate 来完成的。AppCompatDelegate是一个可以放在任意Activity中,并且回调相应生命周期的类。
- 它的继承和实现
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider{
...
}
继承FragmentActivty,不多解释。
AppCompatCallback,为了实现这appcompat能够在一定情况下回调。其实它是为AppCompatDelegate的创建,而AppCompatDelegate相当于一个代理,它能为任何的Activity对象提供AppCompatActivity的特性。
TaskStackBuilder.SupportParentable,TaskStackBuilder是用于跨任务导航的程序类。正常导航:
此时,创建一个Intent来开始新的任务,同时要提供给它一个back stack以重现在应用程序中正常的回退行为。
特殊导航:
此时从通知栏打开活动,用户仅仅看到次活动。
从某种意义上说,开启这个活动的目的是展示通知中难以显示的信息。
在这种情况下,通过创建Intent来启动新任务,无须创建一个back stack。原因在于,启动的活动并非应用程序活动流的一部分。点击回退键则将把用户直接带回Home屏。这里说到了PendingIntent,没错,实现SupportParentable的话它会要求重写以获得PendingIntent
public interface SupportParentable { Intent getSupportParentActivityIntent(); }
public TaskStackBuilder addParentStack(Activity sourceActivity) { Intent parent = null; if (sourceActivity instanceof SupportParentable) { parent = ((SupportParentable) sourceActivity).getSupportParentActivityIntent(); } if (parent == null) { parent = NavUtils.getParentActivityIntent(sourceActivity); } if (parent != null) { // We have the actual parent intent, build the rest from static metadata // then add the direct parent intent to the end. ComponentName target = parent.getComponent(); if (target == null) { target = parent.resolveActivity(mSourceContext.getPackageManager()); } addParentStack(target); addNextIntent(parent); } return this; } //说了这么多,于本章节而说并无多大用处。
ActionBarDrawerToggle.DelegateProvider,见名思意,实现它能提供了Delegate。而Delegate这个类可以干嘛呢?
它能设置Action Bar指示的drawable和内容描述
提供ActionBar的context,指示的drawable,返回的图标是否可见等
让你能简单的使用它的一些AppCompatActivity特性。
这里用到ToolBar来代替ActionBar
开始使用
注意文件styles.xml,要使用Theme.AppCompat.NoActionBar这个主题,不然后面会导致你重复添加报错:
<resources> <style name="AppBaseTheme" parent="Theme.AppCompat.NoActionBar"> <!-- colorPrimaryDark(状态栏底色--> <item name="colorPrimaryDark">@android:color/transparent</item> </style> <style name="AppTheme" parent="AppBaseTheme"></style> </resources>
在layout下新建一个xml文件,包含ToolBar:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" > <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Toolbar Title" android:textAppearance="?android:attr/textAppearanceLarge" /> </android.support.v7.widget.Toolbar>
布局文件activity_main中include进去Toolbar,ToolBar 有高度的灵活性,可以放在布局中的任意位置。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <include layout="@layout/toolbar" /> </RelativeLayout>
Activity中进行初始化
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init(){ Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); setSupportActionBar(toolbar);
Toolbar的用法就不在这里相叙了