fc2ブログ

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

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

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

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を使用する
スポンサーサイト



テキスト読み上げ : TextToSpeech

Android OS によるテキスト読み上げを行うには TextToSpeech クラスを使います。

TextToSpeech クラスは Android 1.6 (API 4) から対応しているため、ほぼ全てのデバイスで機能します。
ただし、読み上げをするには音声データがインストールされている必要があります

標準でインストールされている Google テキスト読み上げエンジンは日本語に対応していないものもあります。
(2012/05/25 発売の HTC J ISW13HT の場合、英語/フランス語/イタリア語/ドイツ語/スペイン語に対応)
読み上げるテキストに対応する言語が含まれていれば、対応する箇所のみ読み上げてくれます

日本語に対応していない場合は、『N2 TTS』等の音声合成アプリをインストールしてください。
(一番下にQRコードを用意しています)
インストールが完了したら一度実行して有効にする必要があります。

テキスト読み上げの設定は、[設定] > [言語とキーボード] > [音声 - テキスト読み上げ] で行います。
android_tts_settings.png

以下、EditText に入力された文字列を再生するサンプルソース。

■ 画面
android_tts.png

■ レイアウト XML (activity_layout.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="speech messages" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="speech" />
</LinearLayout>

■ ソースコード
package jp.inujirushi.android.sample;

import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class TestActivity extends Activity implements View.OnClickListener,
TextToSpeech.OnInitListener {

private static int MY_DATA_CHECK_CODE = 1;

private TextToSpeech mTextToSpeech;
private EditText mEditText;

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

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

// 読み上げるメッセージの入力ボックスを取得する
mEditText = (EditText) findViewById(R.id.editText);

// ボタン押したら入力されたテキストを読み上げる
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}

@Override
protected void onDestroy() {
super.onDestroy();
// TextToSpeech を解放する
if (mTextToSpeech != null) {
mTextToSpeech.shutdown();
}
}

@Override
public void onClick(View v) {
if (mTextToSpeech == null) {
// 初回はテキスト読み上げ可能かチェックする
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
} else {
// テキストを読み上げる
speech();
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// テキスト読み上げ可能チェックから戻った場合
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// 音声リソースが見つかったので TextToSpeech を開始する (-> onInit)
mTextToSpeech = new TextToSpeech(this, this);
} else {
// 音声リソースがなければダウンロードする
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}

/**
* TextToSpeech のエンジンが初期化されたときに呼ばれます。
*/
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
// 日本語に対応していれば日本語に設定する (無くても良い)
Locale locale = Locale.JAPANESE;
if (mTextToSpeech.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE) {
mTextToSpeech.setLanguage(locale);
} else {
Toast.makeText(this, "It does not support the Japanese.", Toast.LENGTH_SHORT).show();
}
// テキストを読み上げる
speech();
} else {
Toast.makeText(this, "TextToSpeech is not supported.", Toast.LENGTH_SHORT).show();
}
}

/**
* 入力されたメッセージを読み上げます。
*/
private void speech() {
// テキスト読み上げ中であれば停止する
if (mTextToSpeech.isSpeaking()) {
mTextToSpeech.stop();
}
// テキストを読み上げる
String message = mEditText.getText().toString();
mTextToSpeech.speak(message, TextToSpeech.QUEUE_FLUSH, null);
}
}



Google Play 「N2 TTS」 株式会社KDDI研究所 提供
https://play.google.com/store/apps/details?id=jp.kddilabs.n2tts
qr_googleplay_n2tts.gif

参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - q. テキスト音声合成の使用
TechBooster - テキストの読み上げ(TextToSpeech)を利用する
プロフィール

とむ・やむくん

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

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

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