ActionBarCompat

2013-04-14T00:00:00+00:00 Android Java

一般的にAndroid3.x以下のバージョンにおいてはActionBarそのものがサポートされてない。でAndroidのサンプル集にActionBarCompatっていうのがあって、それを利用する事でAndroid3.x以下のバージョンでもActionBar同様なUIを実現する事は出来る模様(但し、ActionBarクラス自体が存在する訳じゃないのでそれは使えない。あくまでUI的な所かと)

使い方は以下の通りかと

  • AndroidサンプルからActionBarCompatをライブラリプロジェクトとしてインポート
  • アプリのプロジェクトを作成(既存するのでもオッケー)した後にプロジェクト設定でActionBarCompatのライブラリプロジェクトをインポートする
  • アプリのスタイル設定でAppTheme((ActionBarCompatに定義されている))を設定
  • ActivityはActionBarActivityを継承する

っていう感じだと思われる。で例えば「スタイルを変更したい場合」とかになるとres/xml/styles.xmlを作って

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="MyAppTheme" parent="@style/AppTheme">
        <item name="android:windowTitleBackgroundStyle">@style/MyActionBarCompat</item>
    </style>
    <style name="MyActionBarCompat" parent="@style/ActionBarCompat">
        <item name="android:background">#000</item>
    </style>
</resources>

みたいにActionBarCompatなstyleを継承した形で作り、アプリが参照するandroid:themeを変えてしまえば良いかと。まぁそんな感じでやればAndroid3.x以下のバージョンでもActionBarっぽいUIを利用する事は出来る模様

ついでに今回のソースもろもろを一応書いておく

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="sample.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MyAppTheme">
        <activity
            android:name="sample.test.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActvitiy.java

package sample.test;

import com.example.android.actionbarcompat.ActionBarActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        int itemId = menuItem.getItemId();

        if (itemId == android.R.id.home) {
            makeToast("home");
        } else if (itemId == R.id.menu_refresh) {
            makeToast("refresh");
        } else if (itemId == R.id.menu_search) {
            makeToast("search");
        }

        return super.onOptionsItemSelected(menuItem);
    }

    private void makeToast(String text) {
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    }
}

スクリーンショット

Android2.2の場合は

Android.4.xの場合は(スタイル修正適応前な為若干異なる)

というようになる

最後に、ActionBarすらサポートされてないバージョン向けなアプリはもう必要ないと思います。まぁ業務活用な端末とかでバージョンが古い場合とかに限ってはUIを統一性させる為にこういうのは必要でしょうっていう所だと思う。一般的なWebサービス連携アプリとかの場合になるとAndroid4.x以下のサポートはもう要らないと思う

Android PullToRefresh Twitter Bootstrapとjquery.sidr.jsを組み合わせてみる