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的用法就不在这里相叙了

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