2012年8月12日日曜日

ZXingでバーコードリーダーを作ってみよう①


今回は、Googleが提供しているZXingの使用方法についてまとめてみました。
ZXingは、QRコードやバーコードの生成や読み取りができるライブラリです。
Androidの定番アプリ「QRコードスキャナー」は、このZXingを使用したアプリです。

◆ZXingのダウンロード
以下のページからZXingライブラリをダウンロードします。
http://code.google.com/p/zxing/downloads/list

今回は、ZXing-1.7.zipのバージョンをダウンロードしました。


◆ZXing-1.7.zipの解凍
ZXing-1.7.zipを任意のディレクトリに解凍します。

◆jarファイルの生成

(1) 事前準備
Antを使用してビルドしますので、事前にAntをセットアップしておく必要があります。

(1)-1 Apache Antのダウンロード
以下のページからダウンロードします。
http://ant.apache.org/bindownload.cgi


(1)-2 apache-ant-1.8.4-bin.zipの解凍
apache-ant-1.8.4-bin.zipを任意のディレクトリに解凍します。

(1)-3 パスの設定
ここでは、C:\Program Files配下に解凍したので、以下のようにパスを通しておきます。
Path=*****;C:\Program Files\apache-ant-1.8.4\bin

(1)-4 JAVA_HOMEにJDKを設定
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_21

(2) jarファイルの生成
今回必要とするcore.jarとjavase.jarを生成します。
解凍して出来たzxingフォルダをカレントディレクトリとして、以下のコマンドを実行します。

zxing>
zxing>cd core
zxing\core>
zxing\core>ant

「BUILD SUCCESSFUL」が表示されたことを確認
core配下にcore.jarが作成されます。

zxing\core>cd ../javase
zxing\javase>
zxing\javase>ant

「BUILD SUCCESSFUL」が表示されたことを確認
javase配下にjavase.jarが作成されます。

◆jarファイルをプロジェクトに追加
生成したcore.jarとjavase.jarをプロジェクトに追加します。

ます、任意のプロジェクトを作成します。ここでは、BarcodeReaderとします。
プロジェクトにlibsフォルダを作成して、core.jarとjavase.jarを配置して、これらをLibrariesに追加します。



プロジェクトにReferenced Librariesフォルダが作成されて、その中にcore.jarとjavase.jarが配置されます。

◆RGBLuminanceSource.javaをプロジェクトに追加
Android環境でバーコード画像をデコードする際は、ZXing配布ファイル中のandroidtestパッケージに含まれているRGBLuminanceSource.javaクラスを利用します。
作成中のプロジェクトにRGBLuminanceSource.javaを追加します。



以上で、Zxingを使用してバーコードリーダーを作る準備が整いました。


次回はZXingによるバーコードリーダーのプログラミングについてまとめて見ます。










2012年8月5日日曜日

【更新】聴いて、しゃべって英単語


◆「聴いて、しゃべって英単語」とは

英単語の発音をチェックして、自ら声に出してみる。
楽しみながらネイティブな発音を習得できる英単語学習アプリです。
かなり正確な発音を要求しますので、最初はなかなか正解できないかも知れません。
是非あきらめずに何度もチャレンジして見てください。
次第に正解率が高くなることでしょう。
その時、あなたの発音はネイティブに通じるレベルとなっていることでしょう。

Google playでダウンロード



◆新しくなったところ

1.デザインを一新して、操作性が良くなりました。


2.「戻る」ボタンにより、間違えた問題を再チャレンジできます。

 

3.出題範囲を「全て」「未解答」「不正解」から選択できます。



4.「成績」ボタンから学習結果をグラフで確認できます。


5.メニューキーから学習履歴をクリアできます。 





◆出題範囲について

中学英語の基礎が習得できていれば、英会話に於いてかなりの範囲をカバーできるとのことです。
そういった意味で、本アプリでは中学3年間分の英単語を出題範囲としています。


◆英単語の再生音量について

再生音量はAndroid端末の着信音量ボタンで調整してください。



◆英単語の再生について


本アプリで英単語を再生するには、「テキスト読み上げ」の設定を行う必要があります。
Android端末から、以下の設定を実施してください。
[設定]-[テキスト読み上げ]-[音声データをインストール]
※機種によっては、[設定]-[音声合成]-[音声データをインストール]
設定が完了しましたら、本アプリをいったん終了して再実行してください。


2012年7月16日月曜日

【新作】ハングル単語マスター


ハングルは日本語のように用言の活用があります。
したがって、ハングル単語を基本形で覚えてもあまり役に立ちません。
そこで、「ハングル単語マスター」は、単語をフレーズの中で覚えるスタイルをとっています。
単なる丸暗記ではなく、用言の活用のされ方を理解しながら覚える学習アプリです。

登録されている単語は、日常生活で使用する基本単語です。
今後のアプリ更新によって、登録単語をより充実させていく予定です。
どうぞご期待ください。

尚、当アプリはハングル文字の構造や発音の仕方を一通り学習した方を対象としています。
もちろん、ハングルの入門書でこれらを学習しながら利用することも可能です。




Google Playでダウンロードする


◆ハングルの入力方法について

通常パソコンで使用されている2ボル式という入力方式で入力します。
例えば、「이름(名前)」は「ᄋ」「ᅵ」「ᄅ」「ᅳ」「ᄆ」の順で入力していきます。



   


誤った入力文字の消去は[bs]キーで行ってください。




「ᄈ」「ᄍ」「ᄄ」「ᄁ」「ᄊ」「ᅤ」「ᅨ」の2重子音と2重母音の入力は、
[shift]キーで入力モードを切り替えて行ってください。




当アプリでは、ハングルキーボードの入力方法も覚えることが出来ます。
将来、パソコンでハングル入力を行いたいと思っている方にも有用なアプリとなっています。


◆その他の特長

出題範囲を「全て」「未解答」「不正解」から選択できます。
「学習」ボタンで学習をスタートすると、まず出題範囲を選択するダイアログが表示されます。「全て」「未解答」「不正解」の中から出題範囲を選択してください。


・「成績」ボタンから学習結果をグラフで確認できます。



・メニューキーから「単語一覧」を選択すると、当アプリに登録されている単語一覧を確認でできます。




メニューキーから「設定」を選択すると、出題品詞を「全て」「名詞」「動詞」「形容詞」「副詞」の何れかに設定できます。



2012年5月11日金曜日

【新作】Block Snake

古典的なsnakeゲームが生まれ変わりました。
6個のステージの中から好きなステージを選択してプレイしてください。
操作がとてもシンプルなので、誰でも楽しむことができます。
ちょっとした空き時間に楽しんでください。




2012年5月10日木曜日

AdMobの導入

久しぶりの投稿になります。

今回は、AdMobの導入についてまとめてみました。
広告を挿入して多少なりとも収入が獲得できれば、アプリ作成の励みにもなりますよね。


◆AdMob SDKのダウンロード

最新のSDKは以下のURLからページから取得できます。

https://developers.google.com/mobile-ads-sdk/download



ダウンロードしたZIPファイルを解凍すると、JARファイルとREADMEおよびdocsフォルダが生成されます。



◆SDK JARの追加

Eclipse でプロジェクトの右クリックから[Properties] を選択します。


[JAVA Build Path] の [Libraries] タブを選択して、[Add External JARs] をクリックし、ダウンロードしたJAR を追加します。






◆マニフェストの編集

AndroidManifest.xmlファイルを編集します。

①com.google.ads.AdActivity を宣言する。

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

<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true">

<activity android:label="@string/app_name" android:name="BannerExample">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation"/>

</application>
</manifest>


②広告リクエストを行うには INTERNET と ACCESS_NETWORK_STATE のネットワーク権限が必要なため、これらについても宣言する。

ネットワーク権限を</application>タグの下に挿入すると、以下の警告が出力されるときがあります。

【警告】<uses-permission> tag appears after <application> tag

従って、ネットワーク権限は、はじめから<application>タグより前に挿入した方が良いでしょう。


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

       <uses-permission 
                android:name="android.permission.INTERNET"/>
  <uses-permission
               android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true">

<activity android:label="@string/app_name" android:name="BannerExample">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation"/>

</application>
</manifest>


【参考ページ】
https://developers.google.com/mobile-ads-sdk/docs/android/fundamentals?hl=ja


◆AdViewの追加

AdMobのアカウント登録やアプリケーションのAdMobへの追加については、以下のAdMobページから行って下さい。

http://www.google.co.jp/ads/admob/


AdViewの追加には、AdMobにアプリケーションを追加したときに取得したパブリッシャー コードが必要になります。
あらかじめ確認しておいてください。

以下は、レイアウトXMLにAdViewを追加した例です。

<LinearLayout
android:id="@+id/layout_AdBob"
android:visibility="visible"
android:layout_width="fill_parent" 
android:layout_height="wrap_content">

<com.google.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adUnitId="MY_AD_UNIT_ID"
ads:adSize="BANNER"
ads:loadAdOnCreate="true"/>

</LinearLayout>


ads:adUnitId="MY_AD_UNIT_ID"に、パブリッシャー コードを設定します。










2012年2月26日日曜日

リソースの描画

サンプルの「Snake」を題材として、アプリ作成の基本をまとめるシリーズです。

第五回目は「リソースの描画」です。


まずは、リソースをCanvasに描画する手順についてです。

リソースをBitmapオブジェクトとして取得する場合と、Drawableオブジェクトとして取得する場合とに分けることができます。

◆リソースをBitmapオブジェクトとして取得して描画する場合
①リソースオブジェクトの取得
Resource res = Context.getResource()

②Bitmapオブジェクトの取得
Bitmap image = BitmapFactory.decodeResource(res, R.drawable.画像ファイル名)

③CanvasクラスのメソッドでCanvasに描画
Canvas.drawBitmap(image, int x, int y, Paint p)


◆リソースをDrawableオブジェクトとして取得して描画する場合
①リソースオブジェクトの取得
Resource res = Context.getResource()

②Drawableオブジェクトの取得
Drawable image = res.getDrawable(R.drawable.画像ファイル名)

③DrawableオブジェクトのメソッドでCanvasに描画
image.setBounds(int left, int top, int right, int bottom)
image.draw(Canvas canvas)



次に、「Snake」に於けるリソースの描画です。

「Snake」では、リソースをそのままCanvasに描画してはいません。
まずは、リソースからDrawableオブジェクトとして取得したimageを、CanvasではなくBitmapに、画像データとして描画しています。

【TileView.java】
public void loadTile(int key, Drawable tile) {
Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);//...①
Canvas canvas = new Canvas(bitmap);//...②
tile.setBounds(0, 0, mTileSize, mTileSize);
tile.draw(canvas);//...③
mTileArray[key] = bitmap;
}

①createBitmap()メソッドでBitmapオブジェクト作成
引数のBitmap.Config.ARGB_8888は、Bitmapにフルカラーの色情報を持たせるための設定です。

②Bitmapオブジェクトを引数にして、Canvasオブジェクト作成

③Drawableオブジェクトの描画
引数のcanvasは、Bitmapオブジェクトを引数にして作成したCanvasオブジェクトのため、DrawableオブジェクトはBitmapに描画されます。


そして、このBitmapをCanvasに対して描画しています。

【TileView.java】
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int x = 0; x < mXTileCount; x += 1) {
for (int y = 0; y < mYTileCount; y += 1) {
if (mTileGrid[x][y] > 0) {
canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
mXOffset + x * mTileSize,
mYOffset + y * mTileSize,
mPaint);
}
}
}
}

2012年2月24日金曜日

キーイベント

サンプルの「Snake」を題材として、アプリ作成の基本をまとめるシリーズです。

第四回目は「キーイベント」です。

「Snake」では、ゲーム操作を矢印キーで行うことになっています。

キーが押されると、それを知らせるイベントが発生します。
まずは、そのイベントを受け取れるようにする必要があります。

Viewがキーのイベントを受け取れるようにするには、以下のメソッドを呼び出して、キー操作やトラックボールでフォーカスできる許可を与える必要があります。

setFocusable(true)


「Snake」では、以下のように設定しています。

【SnakeView.java】
private void initSnakeView() {
setFocusable(true);
---------
}

※尚、画面タッチによるフォーカスを許可するメソッドは、setFocusableInTouchMode(true)です。


これで、Viewでイベントを受け取るための準備ができました。
では、次にイベントを受け取ってからの処理をみてみましょう。

キーが押さて、イベントが発生するとonKeyDownメソッドが呼び出されます。

boolean onKeyDown(int keyCode, KeyEvent event)


受け取る引数の内、keyCodeは操作されたキーを識別する整数値です。
keyCodeの値によって条件分岐すれば、操作されたキー毎に異なる処理をさせることができます。

keyCodeは、KeyEventクラスの中で定数として定義されています。
以下は、定数の一部で、「Snake」で利用されています。

KEYCODE_DPAD_UP 上向き矢印キー
KEYCODE_DPAD_DOWN 下向き矢印キー
KEYCODE_DPAD_LEFT 左向き矢印キー
KEYCODE_DPAD_RIGHT 右向き矢印キー


以下は、「Snake」でのonKeyDownメソッドです。
キーを識別して、ヘビの進む方向を保持しているmNextDirectionメンバ変数を更新しているのがわかります。

【SnakeView.java】
public boolean onKeyDown(int keyCode, KeyEvent msg) {
-------------------------------

if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (mDirection != EAST) {
mNextDirection = WEST;
}
return (true);
}

if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (mDirection != WEST) {
mNextDirection = EAST;
}
return (true);
}

return super.onKeyDown(keyCode, msg);
}

onKeyDownの戻り値はtrueを返していますが、イベントを処理した場合はtrue、処理しなかった場合はfalseを返すように定義します。

2012年2月17日金曜日

カスタムView

サンプルの「Snake」を題材として、アプリ作成の基本をまとめるシリーズです。

第三回目は「カスタムView」です。

カスタムViewとは、TextViewやButtonなどの標準のViewではなく、android.view.Viewを拡張して独自に作成したViewのことです。
「Snake」では、TileViewというカスタムViewを作成しています。

・Viewの属性
例えば、標準のTextViewには、textColorやtextSizeなどの属性が用意されています。
カスタムViewに於いても独自の属性を用意することができます。

属性は、res/values/attrs.xmlで作成します。
「Snake」では、以下ように定義しています。

【attrs.xml】
< ?xml version="1.0" encoding="utf-8"?>
< resources>
< declare-styleable name="TileView">
< attr name="tileSize" format="integer" />
< /declare-styleable>
< /resources>

「declare-styleable name」にはカスタムViewのクラス名を、「attr name」には作成する属性名を、「format」には属性のフォーマット名を設定します。

※属性のフォーマット:integer,float,boolean,string,color,dimension

・レイアウト
「Snake」では、カスタムViewをXMLファイルで、以下のようにレイアウトを定義しています。
レイアウトのSnakeViewは、作成したTitleViewを、更に拡張して定義したカスタムViewです。
つまり、カスタムViewを拡張したカスタムViewとなっています。

【snake_layout.xml】
< FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:snake="http://schemas.android.com/apk/res/com.example.android.snake"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

< com.example.android.snake.SnakeView
android:id="@+id/snake"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
snake:tileSize="12"
/>

< /FrameLayout>

作成した属性に対して、tileSize="12"を設定しています。


例えば、下図は属性値をtileSize="24"に設定した場合です。


・コンストラクタ
カスタムViewをXMLファイルでレイアウトするときのコンストラクタの引数に注意してください。
Context contextとAttributeSet attrsが必要になります。

「Snake」では、以下のように定義しています。

【SnakeView.java】
public SnakeView(Context context, AttributeSet attrs) {
super(context, attrs);
initSnakeView();
}


super(context, attrs)で
親クラスのTileViewへ引き渡しています。

【TileView.java】
public TileView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
a.recycle();
}

※R.styleable.TileView -->R.styleable.[declare-styleable name]
※R.styleable.TileView_tileSize -->R.styleable.[declare-styleable name]_[attr name]

obtainStyledAttributes()メソッドによって、TypedArrayインスタンスを作成します。
getInt()メソッドで属性値を取得しています。


属性フォーマットの違いによって、以下のメゾッドなどを利用します。

getInt(int index, int defValue)
getFloat(int index, float defValue)
getBoolean(int index, boolean defValue)
getString(int index)
getColor(int index, int defValue)
getDimensionPixelOffset(int index, int defValue)

2012年2月15日水曜日

定期処理ハンドラ

サンプルの「Snake」を題材として、アプリ作成の基本をまとめるシリーズです。

第二回目は「定期処理ハンドラ」です。

定期処理ハンドラとは、Handlerクラスを利用して、一定の間隔で処理を行わせる仕組みのことです。

例えば、場面場面でキャラクターの出現数の違いによって、処理の重さが異なる場合があります。
処理の重さの違いでキャラクターの動きにムラは出したくありません。
また、端末の処理能力の違いでキャラクターの動く速度が変わってしまうことも避けたいです。

その解決方法の一つとして、定期処理ハンドラの仕組みがあります。
「Snake」では、以下のように定期処理ハンドラを使用しています。

【SnakeView.java】

class RefreshHandler extends Handler {

@Override
public void handleMessage(Message msg) {
SnakeView.this.update();
SnakeView.this.invalidate();
}

public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};


public void update() {
if (mMode == RUNNING) {
long now = System.currentTimeMillis();

if (now - mLastMove > mMoveDelay) {
clearTiles();
updateWalls();
updateSnake();
updateApples();
mLastMove = now;
}
mRedrawHandler.sleep(mMoveDelay);
}
}


sendMessageDelayedメソッドによって、指定時間(delayMillis)後にMessageオブジェクトを送信しています。
Messageオブジェクトは、handleMessageオブジェクトで受信されます。
handleMessageオブジェクトから呼び出されるupdateメソッドでsendMessageDelayedメソッドを呼び出しています。
これを繰り返すことで、指定時間(delayMillis)の間隔で定期的な処理を実現しています。

この定期処理の中で、アップデートやViewの再描画を実施しています。
SnakeView.this.update();
SnakeView.this.invalidate();

前回のアップデートからの経過時間が指定時間(mMoveDelay)より大きい場合のみ、アップデートを実施すれば更新間隔を一定に保つことができます。

sendMessageDelayedメソッドによって送信するMessageオブジェクトは、以下のpublicなフィールドを持つMessageクラスのオブジェクトです。

public int what;
public int arg1;
public int arg2;
public Object obj;

フィールドには、sendMessageDelayedメソッドによって引き渡したい値を代入します。
定期処理を実現するだけならば、引き渡す値は何でもかまいません。
「Snake」では、what=0の値を送信しています。


因みに、指定時間(mMoveDelay)は、以下のように初期設定してあります。
mMoveDelay = 600;

アップデート処理の中で、ヘビがリンゴを食べる度に指定時間(mMoveDelay)を減少させています。
mMoveDelay *= 0.9;

次第に定期処理の間隔を短くして、ヘビの動きを速くすることで、ゲームの面白さを実現しています。


最後に、Messageオブジェクトの詳細です。

Messageオブジェクトの作成とフィールド値の設定は以下のようにします。

Message msg = new Message();
msg.what=123;
msg.arg1=1;
msg.arg1=2;
msg.obj="object";

obtainMessageメソッドを利用すれば、以下のように簡単に出来ます。

Message msg = obtainMessage(123,1,2,"object");


obtainMessageメソッドは以下のようにオーバーロードされています。

obtainMessage(int what)
obtainMessage(int what, Object obj)
obtainMessage(int what, int arg1, int arg2)
obtainMessage(int what, int arg1, int arg2, Object obj)


「Snake」では、obtainMessage(int what)でオブジェクトの作成とフィールド値の設定を行っています。

2012年2月12日日曜日

インスタンスの保存

androidのSDKには多くのサンプルが用意されています。
これはとても良い教材であり、アプリを作成する際のヒントとして、とても重宝しています。

今回から数回にわたり、サンプルの「Snake」を題材として、アプリ作成の基本をまとめてみます。


第一回目は「インスタンスの保存」です。

インスタンスの保存は何故必要なのでしょうか?

端末の向きが変わって画面が回転した場合は、いったんActivityは破棄されて、onCreate()メソッドで再作成されます。
また、長い時間背面に移動していたActivityが前面に戻る様な時も、いったんActivityは破棄されて、onCreate()メソッドで再作成されます。
Activityが破棄されるということは、インスタンスが保持していたデータも消失してしまうことを意味します。

そこでインスタンスの保存が必要になるのです。


「Snake」の例でいうと、背面に移動していたActivityが前面に戻ってきたとき、ゲームの続きからプレイできるように、ヘビとリンゴの位置情報やスコアなどを保存しておく必要があります。

以下のように保存しています。

【Snake.java】

@Override
public void onSaveInstanceState(Bundle outState) {
//Store the game state
outState.putBundle(ICICLE_KEY, mSnakeView.saveState());
}

【SnakeView.java】

public Bundle saveState() {
Bundle map = new Bundle();
map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));
map.putInt("mDirection", Integer.valueOf(mDirection));
map.putInt("mNextDirection", Integer.valueOf(mNextDirection));
map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));
map.putLong("mScore", Long.valueOf(mScore));
map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));
return map;
}

Activityが背面に移動する際に呼び出されるonSaveInstanceState()メソッドをオーバーライドして、その中で必要なデータを保存しています。
引数のBundleオブジェクトにヘビやリンゴの状態、スコアなどを保存しているのがわかります。


保存したデータは、以下のように読み出しています。

【Snake.java】

@Override
public void onCreate(Bundle savedInstanceState) {

--------------

// We are being restored
Bundle map = savedInstanceState.getBundle(ICICLE_KEY);
if (map != null) {
mSnakeView.restoreState(map);
}

--------------

}


【SnakeView.java】

public void restoreState(Bundle icicle) {
setMode(PAUSE);
mAppleList = coordArrayToArrayList(icicle.getIntArray("mAppleList"));
mDirection = icicle.getInt("mDirection");
mNextDirection = icicle.getInt("mNextDirection");
mMoveDelay = icicle.getLong("mMoveDelay");
mScore = icicle.getLong("mScore");
mSnakeTrail = coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));
}


onCreate()メソッドの引数であるBundleオブジェクトから、ヘビやリンゴの状態、スコアなどを読み出しているのがわかります。

2012年1月29日日曜日

PreferenceActivityのレイアウトをカスタマイズ

PreferenceActivityにTextViewやButtonを配置したいときがあります。

(例)「国旗deクイズ」に於ける使用例



今回は、PreferenceActivityのレイアウトをカスタマイズする方法をまとめてみました。

PreferenceActivityクラスはListActivityを継承したクラスです。
必要に応じてリストにコンポーネントを設定することで設定画面を作成する仕様となっています。

リスト本体のレイアウトは、ListActivityクラスを継承したサブクラスを作成するときと同じす。
つまり、オーバーライドしたonCreate()メソッドの中でsetContentView()によって設定します。

以下はPreferenceActivityのデフォルト設定です。

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

setContentView(com.android.internal.R.layout.preference_list_content);

mPreferenceManager = onCreatePreferenceManager();
getListView().setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
}

・XMLレイアウト(preference_list_content.xml)
<xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
android:scrollbarAlwaysDrawVerticalTrack="true"
/>

PreferenceActivityにTextViewやButtonを配置したいときは、
PreferenceActivityを継承したサブクラスでonCreate()をオーバーライドして、
用意したXMLレイアウトをsetContentView()に設定します。

以下はTextViewを一つ配置する例です。
コンポーネントはCheckBoxPreferenceを一つ設定します。

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

setContentView(my_preference_list_content.xml);
addPreferencesFromResource(R.xml.settings);
}


・XMLレイアウト(my_preference_list_content.xml)
<xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="国旗deクイズ "/>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>


・XMLコンポーネント(setting.xml)
<xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="setting"
android:title="データの保存"
android:summary="データの保存をONにする"
android:defaultValue="true" />
</PreferenceScreen>

2012年1月22日日曜日

【新作】国旗deクイズ

国旗クイズの決定版。表示される国旗の国名を、リストから選択して当てるゲームです。

  


ゲームをスタートすると、出題範囲を選択するダイアログが表示されます。
「全て」「未解答」「不正解」の中から出題範囲を選んでください。
選択した範囲からランダムに10問が出題されます。

また、設定画面からは出題地域を選択することもできます。
「全域」「アジア」「アフリカ」「ヨーロッパ」「北アメリカ」「南アメリカ」「オセアニア」の中から選んでください。

  

ゲーム結果について、過去10回の成績をグラフ表示で確認することができます。

1ゲームあたり数分で、楽しく気軽に楽しめる国旗クイズです。通勤通学の電車の中など、毎日のちょっとした空き時間にお楽しみいただけます。