戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
08

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ネットワーク通信ライブラリ : Volley

Google I/O 2013 で Android のネットワーク通信処理を行う Volley ライブラリが発表・公開されました。

すでに公開から半年近く経っているため今更感もありますが簡単に使い方を書いていきます。
(Google I/O 2013 は 2013/05/16 開催)


■ Volley とは
Volley はネットワーク通信処理を簡単に、そして、早く実装することができるライブラリです。
Volley ではネットワーク通信は非同期で処理され、リクエストのコールバックは UIスレッドで処理されます。
その他、メモリキャッシュとディスクキャッシュ、リクエストの優先順位付けなど行うことが出来ます。

ただし、レスポンス全体がメモリに確保されるため、大きなファイルやストリーミング処理には適さないようです。


■ Volley ライブラリを取得する
Volley ライブラリは Git リポジトリで公開されているため、Git を使ってインポートする必要があります。
( Git がない人はインストールしてください → git GUI Clients :: http://git-scm.com/downloads )
git clone https://android.googlesource.com/platform/frameworks/volley

clone で取得したプロジェクトは Android プロジェクトとしてインポートします。
このプロジェクトは Is Library にチェックが入っていないため、チェックを入れてから使用してください。

※リソースファイルがないため、Jarファイルにエクスポートして取り込むことも出来ます。


■ Volley ライブラリを使う!
Volley はネットワーク通信を行うので、AndroidManifest.xml にネットワーク許可のパーミッションを追加します。
<uses-permission android:name="android.permission.INTERNET" />

実際に HTTPリクエストを行ってデータを取得するには以下のように行います。
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

public class SampleActivity extends Activity {

private RequestQueue mQueue;

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

// 取得した文字列を表示する TextView を生成する
final TextView textView = new TextView(this);
setContentView(textView);

// HTTPリクエストを行う Queue を生成する
mQueue = Volley.newRequestQueue(this);

// 指定したURLから文字列を取得する
String url = "http://inujirushi123.blog.fc2.com/?xml";
mQueue.add(new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
}, null));
}
}
ここでは文字列を取得していますが、30行目で渡す StringRequest を変更することで様々な形式でデータを取得できます。

用意されているリクエスト
ClearCacheRequest
ImageRequest
JsonRequest (JSON処理用の抽象クラス)
JsonArrayRequest
JsonObjectRequest
StringRequest

Volley では上記のリクエストが用意されていますが Request クラスを継承することで独自の Request クラスを作ることも出来ます。
例えば、Villey では XML 用のリクエストが用意されていないため Request クラスを拡張する必要があります。
実装方法は Y.A.M の雑記帳 - Volley を使って XML を処理する がとても参考になります。


Volley では画像取得用に ImageRequest が用意されていますが、NetworkImageView という ImageView の拡張クラスも用意されています。
次のサンプルソースの30行目の引数で new ImageCache() を渡しているところでキャッシュ処理を行います。
null を渡すと NullPointerExcepton が発生するため、キャッシュ不要の場合でも定義する必要があります。
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

public class SampleActivity extends Activity {

private RequestQueue mQueue;

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

// Volley に用意された ImageView の拡張クラス NetworkImageView を生成する
NetworkImageView imageView = new NetworkImageView(this);
setContentView(imageView);

// HTTPリクエストを行う Queue を生成する
mQueue = Volley.newRequestQueue(this);

// 指定したURLから画像を取得する
String url = "http://source.android.com/images/Android_Robot_100.png";
imageView.setImageUrl(url, new ImageLoader(mQueue, new ImageCache() {
// キャッシュ処理が必要な場合はここに記述します
@Override
public void putBitmap(String url, Bitmap bitmap) {
}

@Override
public Bitmap getBitmap(String url) {
return null;
}
}));
}
}


と、Volley を試してみましたが通信処理が簡単に実装できて良いですね!
最初に書いたように大きなファイルやストリーミング処理に適さないため、全ての通信処理で Volley を使うというわけには行きませんが、率先して使っていこうかと思います。


■ 参考サイト
throw Life - Volley(AndroidのHTTP通信ライブラリ)を使おう
TechBooster - ネットワーク通信用ライブラリVolleyを使いこなす
Y.A.M の雑記帳 - Google I/O 2013 - Android : Volley: Easy, Fast Networking for Android
Y.A.M の雑記帳 - Volley を使って XML を処理する
クラスメソッド Developers.IO - Android Tips #51 ネットワーク通信・キャッシュ処理をより速く、簡単に実装できるライブラリ “Volley” を使ってみた

非同期処理:AsyncTaskLoader

AsyncTaskLoader は Android で用意された非同期処理に特化したスレッドクラスです。



AsyncTaskLoader クラスは Android 3.0 (API 11) から追加された Loader クラスのサブクラスで、以前「非同期処理:AsyncTask」で紹介した AsyncTask を内包しています。

Android 3.0 で追加されていますが Android Support Library に含まれているため、Android 3.0 以前でも利用できます。
Android Support Library の場合、Loader を実行するために必要な getSupportLoaderManager が FragmentActivity に実装されているため、呼び出し元のアクティビティは FragmentActivity を継承する必要があります。

AsyncTaskLoader と AsyncTask の違いは UI 処理をどこで行うかにあります。
AsyncTask では非同期処理の実行前後の UI 処理は AsyncTask クラス内に定義していましたが
AsyncTaskLoader では LoaderCallbacks インターフェイスを介して行われるため、非同期処理の実行前後の UI 処理も Activity 内に定義できるようになりました。
これにより UI 処理は Activity 側、非同期処理は AsyncTaskLoader 側と住み分けができるようになっています。
android_AsyncTaskLoader.png


■ ソースコードで定義
次のサンプルコードでは Android Support Library の AsyncTaskLoader を使っています。
package jp.inujirushi.android.sample;

import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.widget.Toast;

public class SampleActivity extends FragmentActivity implements
LoaderCallbacks<Boolean> {

// Activity が生成された時に呼ばれます
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);

// Loader を実行する
// 第2引数で onCreateLoader に渡される Bundle を指定するがこのサンプルでは使用しないので null
getSupportLoaderManager().initLoader(0, null, this);
}

// Loader を新規作成する時に呼ばれます。
// 戻り値には実行する Loader を指定してください。
// AsyncTask#onPreExecute() で行っていた処理もここに記述します。
@Override
public Loader<Boolean> onCreateLoader(int id, Bundle bundle) {
// ProgressDialog を生成する
TestProgressDialog dialog = new TestProgressDialog();
Bundle args = new Bundle();
args.putString(TestProgressDialog.PARAM_MESSAGE, "now loaging...");
dialog.setArguments(args);

// ProgressDialog をキャンセルしたら Loader もキャンセルするよう設定する
dialog.setCancelable(true);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Loader<Object> loader = getSupportLoaderManager().getLoader(0);
// Loader をキャンセルする
if (loader != null) {
((AsyncTaskLoader<?>) loader).cancelLoad();
}
}
});

// ProgressDialog を表示する
dialog.show(getSupportFragmentManager(), "progress");

// 生成した Loader を返します
return new SampleAsyncTaskLoader(this);
}

// Loader の処理が完了した時に呼ばれます。
// キャンセル時には呼ばれません。
// AsyncTask#onPostExecute() で行っていた処理はここに記述します。
@Override
public void onLoadFinished(Loader<Boolean> loader, Boolean result) {
// ProgressDialog を破棄する
TestProgressDialog dialog = (TestProgressDialog) getSupportFragmentManager()
.findFragmentByTag("progress");
if (dialog != null) {
dialog.onDismiss(dialog.getDialog());
}

// 結果をトースト表示する
Toast.makeText(this, "result=" + result, Toast.LENGTH_SHORT).show();
}

// Loader が完全に破棄される時に呼ばれます。
@Override
public void onLoaderReset(Loader<Boolean> loader) {
}

/**
* Loader 処理クラス。
*/
static class SampleAsyncTaskLoader extends AsyncTaskLoader<Boolean> {
/**
* コンストラクタ。
* @param context
* コンストラクタ
*/
public SampleAsyncTaskLoader(Context context) {
super(context);
}

// 非同期処理を行います。
// キャンセル有無にかかわらず処理は最後まで流れます。
@Override
public Boolean loadInBackground() {
// 10秒間処理をしているように見せかけるためスリープ
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
return true;
}

// キャンセルされた時に呼ばれます。
// この処理は loadInBackground() の完了後に行われます。
@Override
public void onCanceled(Boolean data) {
}

// Loader が開始された時に呼ばれます。
@Override
protected void onStartLoading() {
// Loader を開始する
forceLoad();
}
}
}
非同期処理の流れ
① FragmentActivity#getSupportLoaderManager().initLoader()
② LoaderCallbacks#onCreateLoader()
③ AsyncTaskLoader#onStartLoading()
④ AsyncTaskLoader#loadInBackground()
⑤ LoaderCallbacks#onLoadFinished() ※キャンセル時は AsyncTaskLoader#onCanceled()

④の非同期処理は③で AsyncTaskLoader#forceLoad() を呼ぶ必要があります。
呼ばなかった場合、非同期処理は行われません(…ここで少しはまりました…)


■ 参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - 1.2 ローダ
TechBooster - AsyncTaskLoaderを利用した非同期処理を行う
クラスメソッド Developers.IO - AsyncTaskLoaderを使ってみる
コジオニルク - 1.11. AsyncTaskLoader

Android におけるデータ管理

Android におけるデータの管理について簡単にまとめてみました。
android_data.png
Intent
他のコンポーネント(アクティビティ、サービス、ブロードキャストレシーバ)とのデータの受け渡しを行う際に使います。
設定した任意のデータに加え、コンポーネントや Android システムに関与する情報を持っています。

Bundle
画面の状態を一時的に保存するために使われます。
画面を回転してアクティビティを再生成したとき、他のアプリからリソース要求 (メモリ不足) されてプロセスがキルされたときに元の状態に復帰させるために使います。
onSaveInstanceState() で画面の状態を保存し、onRestoreInstanceState() または onCreate() で復帰します。

永続データ (Preference / SQLite / File)
アプリケーションが終了してもデータを保持していたい場合に使います。
これらは他のアプリと共有して扱うことができます。



static 変数
Android では static 変数をキャッシュ以外の目的で使ってはいけません。 (static final は除く)

Android ではアプリの終了≠プロセスの終了ではないため、static 変数がすぐに解放されるわけではありません。
そのためアプリを再開したときに static 変数が終了時のまま再開することになります。
(不要なプロセスはシステムが頻繁に終了させているため、再開時に必ず残っているというわけではなりません)

また、他のアプリがリソースを要求(メモリ不足)することによりプロセスがキルされた場合も同様です。
プロセスがキルされてもアクティビティはスタックに詰まれたままとなっているため、static 変数により状態を管理していると想定されない処理が行われる可能性があります。
例外発生時のアプリ終了も同様です⇒『Androidの例外処理


■ 参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - 4. インテントとインテントフィルタ
ソフトウェア技術ドキュメントを勝手に翻訳 - 8. データ保存
Experiments Never Fail - Android の Static 変数はヤバい
猫好きモバイルアプリケーション開発者記録 - Androidでstatic変数が勝手にクリアされる問題と対処法

Android 2.1 ~ 向け ActionBar : ActionBarActivity (Android Support Library r18)

Android 3.0 (API 11) から追加された ActionBar
Android Design でも重要視されているユーザインターフェースで、従来のタイトルバーの代わりにアプリのアイコン、タイトル名、オプションメニューを配置できるウィジェットです。

従来のタイトル
android_titlebar.png

ActionBar
android_actionbar.png

ActionBar は Android 3.0 から追加されたため、それ以前の Andoroid 2.x では使うことができません。
そこで API Level 間の違いを解消するための Support Library を使います。
※ 2013/07/24 に公開された Android Support Library r18 より ActionBar に対応しました。
未対応時に ActionBarSherlock を使って ActionBar に対応していた方も簡単に移行することができます。

なお、ActionBar に対応した Support Library は android-support-v7 なので Android 2.1 (API 7) からしか使うことができません。


以下は、Eclipse (日本語パッチ) 環境にて行っています。
(Windows7 なのに C 直下に android フォルダあるのは気にしないでください…)

本家 (Android Developers | Support Library Setup)
http://developer.android.com/tools/support-library/setup.html

■ Android Support Library の取得/更新
[ウィンドウ] - [Android SDK マネージャー] を起動し、
[Extras] > [Android Support Library] にチェックを入れてインストールをします。

android_actionbar_support_download.png

インストールが完了すると以下のフォルダが生成されます。
[ANDROID_SDK_HOME]\extras\android\support\v7


■ ライブラリプロジェクトのインポート
ActionBar はリソースファイルを扱うため jar ではなく、ライブラリプロジェクトになっています。

取得した [ANDROID_SDK_HOME]\extras\android\support\v7\appcompat をインポートします。
[ファイル] - [新規] - [プロジェクト] から [Android] > [既存コードからの Andorid プロジェクト]

インポートする際には 『プロジェクトをワークスペースにコピー』にチェックを入れてください。

インポートが完了すると android-support-v7-appcompat プロジェクトが作成されます。
android_actionbar_support_project.png


■ ライブラリプロジェクトの参照
Android プロジェクトを作成しますが作成するプロジェクトは以下のバージョンを指定してください。
・Minumum Required SDK > API 7 : Android 2.1 (Eclair) 以上
・Target SDK > API 14 : Android 4.0 (IceCreamSandwich) 以上


プロジェクトが作成し終わったら、android-support-v7-appcompat を参照します。
作成したプロジェクトを右クリックし [プロパティー] を選択。
ライブラリーに android-support-v7-appcompat を追加します。
android_actionbar_support_libraryadd.png

次に、作成したプロジェクトの libs フォルダに android-support-v7-appcompat プロジェクトの libs フォルダ内の jar ファイルをコピーします。
(ライブラリプロジェクト内にあればいいはずなのに参照元にも無いとエラーになりました…)
android_actionbar_support_project2.png

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time)
とエラーが出た場合、作成したプロジェクトと android-support-v7-appcompat の android-support-v4.jar ファイルのバージョンが異なっています。android-support-v4.jar をコピーするか、最新にしてクリーンしてください。

これでライブラリプロジェクトの参照が完了しました。


■ 実装
ライブラリプロジェクトを参照したことで後は実装するだけですが、ActionBar を使うには以下のルールを守る必要があります。
・ActionBarActivity を継承する
・AppCompat のテーマを設定する


ActionBarActivity を継承しているのにテーマが設定されない場合、コンパイルは通りますが実行時に以下のエラーが発生します。
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

テーマは AndroidManifest.xml にある application で使用している theme を変更します。
ContextThemeWrapper#setTheme(int resid) で動的に設定してもエラーになります。

設定できるテーマは以下のとおり。
・Theme.AppCompat
・Theme.AppCompat.Light
・Theme.AppCompat.Light.DarkActionBar


/res/values/styles.xml
<!-- <style name="AppBaseTheme" parent="android:Theme.Light"> -->
<style name="AppBaseTheme" parent="Theme.AppCompat">

以上の設定が完了すれば準備完了です。
最初に表示した(↑にある) ActionBar は以下のソースコードによって形成されています。
package jp.inujirushi.android.sample;

import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;

public class TestActivity extends ActionBarActivity {

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

// レイアウトを設定する
setContentView(R.layout.activity_layout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add("HELP").setIcon(
android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(item,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
}
テーマを xml 側で定義する必要がありますが、それ以外では ActionBarActivity を継承するだけで特別な設定は必要ありません。
なお、ActionBarActivity は FragmentActivity を継承しているので Fragment を使うこともできます。


■ ActionBarSherlock からの移行
ActionBarSherlock から移行する場合 Menu/MenuItem を Andriod 標準のものに戻します。
MenuItem#setShowAsAction(int actionEnum) 等は ActionBar と同じ Android 3.0 (API 11) から追加されているため MenuItemCompat のメソッドを使います。

ActionBarSherlock
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("HELP").setIcon(android.R.drawable.ic_menu_help)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}

android-support-v7
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add("HELP").setIcon(android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}


ActionBarSherlock の記事を書いた2日後に実装されるとかタイミングが悪かった…


■ 参考サイト
Android Developers - Support Library Setup
ソフトウェア技術ドキュメントを勝手に翻訳 - 6.3 アクションバーの使用
クラスメソッド開発者ブログ - [Android Tips] Support Library に追加された ActionBarActivity を使ってみた
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (準備編)
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (実装編)
Qiita|nagakenjs - ActionBarActivity移行メモ

Android 2.x 向け ActionBar : ActionBarSherlock

2013/07/24 二リリースされた Android Support Library r18 より ActionBar が Support Library に含まれるようになりました。 (この記事書いた2日後…)
これから ActionBar の実装を考えられている方は公式である Support Library を使うようにしましょう。
Android 2.1 ~ 向け ActionBar : Android Support Library r18


Android 3.0 (API 11) から追加された ActionBar
Android Design でも重要視されているユーザインターフェースで、従来のタイトルバーの代わりにアプリのアイコン、タイトル名、オプションメニューを配置できるウィジェットです。

従来のタイトル
android_titlebar.png

ActionBar
android_actionbar.png

ActionBar は Android 3.0 から追加されたため、それ以前の Andoroid 2.x では使うことができません。
API Level 間の違いを解消するためのサポートライブラリである SupportPackage (*1) にも含まれていません。
そこで SupportPackage を拡張して作られた ActionBarSherlock ライブラリを使います。

ActionBarSherlock を使うことで、Android 2.x でも ActionBar を使うことができるようになりますが、apk のサイズが 300~400k 程大きくなる欠点があります。

*1 ADT r20 以降、プロジェクト作成時に自動で libs に作成される android-support-v4.jar


■ ダウンロード
ActionBarSherlock のトップページにある Download から zip ファイルを落とします。
2013/07/22 時点の最新版は v4.3.1


■ ライブラリプロジェクトのインポート
ActionBarSherlock はリソースファイルを扱うため jar ではなく、ライブラリプロジェクトになっています。
このライブラリプロジェクトのターゲットは Android 4.0 (API 14) になっているので、Android SDK Manager で Android 4.0 のパッケージをダウンロードしている必要があります

準備ができたらダウンロードしたファイルを解凍し、ハイフンの付いていない無印の actionbarsherlock をインポートします。
[ファイル] - [新規] - [プロジェクト] から [Android - 既存コードからの Andorid プロジェクト]
android_actionbar_project.png


■ ライブラリプロジェクトの参照
Android プロジェクトを作成しますが前述にも書いたように ActionBarSherlock のターゲットは Android 4.0 (API 14) になっているため、ライブラリを使用するプロジェクトの Target SDK は API 14 : Android 4.0 以上にする必要があります

プロジェクトが作成し終わったら、ActionBarSherlock を参照します。
作成したプロジェクトを右クリックし [プロパティー] を選択。
ライブラリーに ActionBarSherlock を追加します。
android_actionbar_libraryadd.png

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time)
とエラーが出た場合、プロジェクトと ActionBarSherlock の android-support-v4.jar のバージョンが異なっています。android-support-v4.jar を最新にしてクリーンするか、作成したプロジェクトから android-support-v4.jar を削除してください (ActionBarSherlock に含まれているため削除してもOK)


■ 実装
ライブラリプロジェクトを参照したことで後は実装するだけですが、ActionBarSherlock を使うには以下のルールを守る必要があります。
・SherlockActivity を継承する
・Sherlock のテーマを設定する


SherlockActivity を継承しているのにテーマが設定されない場合、コンパイルは通りますが実行時に以下のエラーが発生します。
java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.


最初に表示した(↑にある) ActionBar は以下のソースコードによって形成されています。
package jp.inujirushi.android.sample;

import android.os.Bundle;
import android.view.Window;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class TestActivity extends SherlockActivity {

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

// テーマを設定する (必須)
setTheme(R.style.Theme_Sherlock);

// タイトルバーを非表示
requestWindowFeature(Window.FEATURE_NO_TITLE);

// レイアウトを設定する
setContentView(R.layout.activity_layout);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("HELP").setIcon(android.R.drawable.ic_menu_help)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
}
ActionBarSherlock ではテーマの設定は必須になりますが設定できるテーマは以下のとおり。
・Theme_Sherlock
・Theme_Sherlock_NoActionBar
・Theme_Sherlock_Light
・Theme_Sherlock_Light_DarkActionBar
・Theme_Sherlock_Light_NoActionBar

Theme_Sherlock は元のアクティビティ(ここでは黒色)。
Theme_Sherlock_Light は白色を基調としたテーマになります。
Theme_Sherlock なのに白いよー。という人は res/styles.xml を確認してください。
AppBaseTheme (または AppTheme) の parent が Theme.Light になっているので Theme または Theme.Black にすれば黒になります。
<!-- <style name="AppBaseTheme" parent="android:Theme.Light"> -->
<style name="AppBaseTheme" parent="android:Theme">
アクションバーを表示させても通常のタイトルバーは消えないので、requestWindowFeature(int featureId)
を呼んでタイトルバーを非表示にしています。
ここで import している Window クラスは android.view.Window。
com.actionbarsherlock.view.Window だと ActionBar が表示されませんでした。値一緒のはずなのに…。

ActionBar 右に表示されているオプションメニューを追加するには onCreateOptionsMenu(Menu menu) をオーバーライドします。
オプションメニュー選択時の操作は onOptionsItemSelected(MenuItem item)。
詳しい実装は ActionBar (Android3.0~) を書くときにでも(書けたらいいな)。


■ ダウンロードサイト
ActionBarSherlock

■ 参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - 6.3 アクションバーの使用
gabuchanの日記 - Android 2.xでAction Barが使えるActionBarSherlockの使い方
TechBooster - ActionBarSherlockライブラリを使って、2.xでもActionBarを使用する
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。