うさがにっき

読書感想文とプログラムのこと書いてきます

ActionBarActivityが非推奨になったようなので、その代わりに新しく出たAppCompatActivityについて調べてみた

概要

AndroidStudio1.2を使っていてActivityを作成したら、継承元のActionBarActivityが非推奨だと注意された
なのでUpdate StateをStatableからBetaに変えて1.3をダウンロードして、Activityを作り直したところAppCompatActivityなるものが継承元として作成された
このAppCompatActivityについて調べて見る

詳細

AppCompatActivityの構成

どうやら新しいsupport v7ライブラリによって作成されたActivityらしい
実質的なActivityの処理はAppCompatActivityが持つAppCompatDelegateによって処理されている様子(と言ってもAppCompatDelegateの中身はabstractメソッドばかりだったが)

超略したクラス図
f:id:tiro105:20150718113321p:plain

AppCompatActivityソースの一部

Public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
        TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider {
    private AppCompatDelegate mDelegate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getDelegate().installViewFactory();
        super.onCreate(savedInstanceState);
        getDelegate().onCreate(savedInstanceState);
    }
…
   /**
     * @return The {@link AppCompatDelegate} being used by this Activity.
     */
    public AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, this);
        }
        return mDelegate;
    }
}

Activityの肥大化が問題とされて久しいが、こういう実装方法が今度主流になっていくのだろうか

AppCompatActivity, AppCompatDelegateができること

AppCompatActivityを継承しなくてもAppCompatDelegateを使えばそれっぽいActionBarのついたActivityが作れるようになったことかな?

例えばActivityをこうする

<android.support.v7.widget.Toolbar

    android:id="@+id/my_awesome_toolbar"
    android:layout_height="@dimen/abc_action_bar_
default_height_material"
    android:layout_width="match_parent"
    android:minHeight="@dimen/abc_action_bar_
default_height_material"
    android:background="?attr/colorPrimary"

    />
public class MainActivity extends Activity implements AppCompatCallback {

    @Override
    public void onSupportActionModeStarted(ActionMode mode) {
      //let's leave this empty, for now
    }

    @Override
    public void onSupportActionModeFinished(ActionMode mode) {   
      // let's leave this empty, for now
    }

AppCompatCallbackはAppCompatDelegateを使う上で実装しておく必要があるメソッド
詳しくはソースを読めばわかる

んでこう続く

private AppCompatDelegate delegate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //let's create the delegate, passing the activity at both arguments (Activity, AppCompatCallback)
    delegate = AppCompatDelegate.create(this, this);

    //we need to call the onCreate() of the AppCompatDelegate
    delegate.onCreate(savedInstanceState);

    //we use the delegate to inflate the layout
    delegate.setContentView(R.layout.activity_main);

    //Finally, let's add the Toolbar
    Toolbar toolbar= (Toolbar) findViewById(R.id.my_awesome_toolbar);
    delegate.setSupportActionBar(toolbar);
}

これでAppCompatActivityやActionBarActivityを継承しなくてもToolBarがついたActivityが作成できる
ToolBarをActivityから切り離して、delegateに委譲したってことの様子