AppCompatActivity使用


  • 支持包更新到22.1之後,Android Studio項目的Activity默認繼承這個類。
  • ActionBarActivity已替代ActionBarActivity

這並不只是命名的改變,內部實現原理其實是通過AppCompatDelegate 來完成的。AppCompatDelegate是一個可以放在任意Activity中,並且回調相應生命週期的類。

  • 它的繼承和實現
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
        TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider{
        ...
 }
  1. 繼承FragmentActivty,不多解釋。

  2. AppCompatCallback,爲了實現這appcompat能夠在一定情況下回調。其實它是爲AppCompatDelegate的創建,而AppCompatDelegate相當於一個代理,它能爲任何的Activity對象提供AppCompatActivity的特性。

  3. 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;
    }
    //說了這麼多,於本章節而說並無多大用處。
    
  4. 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的用法就不在這裏相敘了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章