ActionBar Sharlock 盛り込み

むむむむ、と言いつつ着手。
ちなみに以下なリポジトリは入手済みでプロジェクトも作成してた。

プロジェクトのプロパティから Android -> Library なソレに追加。つうかこれってどこに反映されるんだろ。現時点で構成管理の範疇には入っていないのでこれはこれで問題なのではないだろうか。

盛り込み続行

とりあえずスルーで続けます。AndroidManifest.xml の minSdkVersion は 10 (2.3.3) ってことにしておく方向で。
修正して上書きしたらあちこちに赤いばってんマークが出現。つうかその前の Theme を云々、とハンズオンの資料にはありますね。

むむむむ

ええと、今って res/values/styles.xml に Theme.Holo.Light を継承した style を定義しててそれを使ってます。以下なカンジ。

<resources>

    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:actionBarStyle">@style/my_actionbar_style</item>
    </style>
    
    <style name="my_actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">#50D2FF</item>
        <item name="android:icon">@drawable/ic_actionbar</item>
    </style>
    
</resources>

で、android:actionBarStyle だの Widget.Holo.Light.ActionBar だので赤いバツが出ております。ちなみに ABS なライブラリプロジェクトの res/配下に values-v11 とか values-v14 などというディレクトリがあります。
その中には abs__themes.xml というファイルがありまして、v11 のソレは以下な記述となっております。

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <style name="Sherlock.__Theme" parent="android:Theme.Holo">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
    </style>
    <style name="Sherlock.__Theme.Light" parent="android:Theme.Holo.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
    </style>
</resources>

これ、@style/Theme.Sherlock.Light が Holo.Light の子供になってます。ので AppBaseTheme の親をこれにしときゃ良いのか。
や、異なる部分は全部 v11 とか v14 に分かち書きすりゃ良いの?
つうことで、res/values/styles.xml は以下に。

<resources>
</resources>

res/values-v11/styles.xml が以下。

<resources>

    <style name="AppBaseTheme" parent="@style/Theme.Sherlock.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="actionBarStyle">@style/my_actionbar_style</item>
    </style>
    
    <style name="my_actionbar_style" parent="Widget.Sherlock.ActionBar">
        <item name="android:background">#50D2FF</item>
        <item name="android:icon">@drawable/ic_actionbar</item>
    </style>
    
</resources>

あるいは res/values-v14/styles.xml が以下。

<resources>

    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:actionBarStyle">@style/my_actionbar_style</item>
    </style>
    
    <style name="my_actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">#50D2FF</item>
        <item name="android:icon">@drawable/ic_actionbar</item>
    </style>
    
</resources>

本当かなぁ。Theme はとりあえずこれで OK ということにしておいて src 配下のエラーの対処を。とりあえず Activity を継承してる方々は SherlockActivity を、という形にしていけば良いのかどうか。順に赤バツなファイルを開いて様子を見てみます。

android.support.v4.* な import

エラーになっておりますね。これは自分プロジェクトの android-support-v4.jar と ABS なライブラリプロジェクトのソレが conflict しているとのこと。自分プロジェクトの libs 配下のソレを削除します。これでエラーは解消。
これ意外には以下な箇所でコンパイルエラーが出ている模様。

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test1);
		
		
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(true);

getActionBar() 呼び出し部分と setHomeButtonEnabled() 呼び出し部分。getActionBar のソレは以下にせよ、とハンズオンのテキストにありますね。

getSherlockActivity().getSupportActionBar();

置き換えたんですが getSherlockActivity() 呼び出し部分でコンパイルエラーだな。実はこのクラスは FragmentActivity を継承したものになってるのですが、これを SherlockFragmentActivity に置換しないといけない模様。
置換しても駄目だったのですが、android.app.ActionBar な import を削除して以下を import するようにしたら解決しました。

import com.actionbarsherlock.app.ActionBar;

色々紆余曲折ですね。とりあえず

  • Activity を継承しているものは SherlockActivity を継承
  • FragmentActivity を継承しているものは SherlockFragmentActivity を継承

という形に、らしいです。
やれやれ、と思ったらこんどは

  • onCreateOptionsMenu
  • onOptionsItemSelected

がコンパイルエラー。引数の型に com.actionbarsherlock.view. を付けよ、とハンズオンのテキストにあります。付加したらコンパイルエラーは解消されましたが、以下な命令でコンパイルエラーが出た。

	public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.top, menu);

ここは getSupportMenuInflater() に置換せよ、とのこと。これで一つ目はエラー解消されました。

ちゃくちゃくと進めていると

PreferenceFragment を扱ってるクラスでがっつりコンパイルエラーがアレ。これ、なんとなく地雷系だな。ちょっとスルーして他のソレを直します。
つうかこれって PreferenceFragment を使うのとりあえずヤメとけ、という事なのか。SherlockPreferenceActivity ってのがあるで、って出てますね。
でも addPreferencesFromResource が deprecated って出るな。
構わずに無理やり修正して実行してみたら ICS な端末では挙動は変わりませんでした。手元に 2.3 系な端末が無いので動作確認は来週以降の方向。