- 支持包更新到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的用法就不在這裏相敘了