10-1. Android
Android の開発
Android は Linux 上に Javaの仮想マシンである Dalvik仮想マシンを載 せたものです。 GUI は Activity というタッチパネルを活用したもので、Swing や JavaFX とは違います。 定数などはリソースとして定義できるため、プログラムに定数を置く必要 がありません。
開発は基本はPCなどを使うクロス環境で、エミュレータも配布されてます ので、実機がなくても開発できます。 ただ、様々な画面サイズやOSのバージョンがあります。 これに対して様々な組み合わせでエミュレータを起動できます。 動作できる装置が多い程よいので、可能な限り古いバージョンで製作します。 但し、端末の性能が
android.support.v7.app.AppCompatActivity
AppCompatActivity のドキュメント は公式ページにあります。 FragmentActivityを継承し、 AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider を実装しています。 マニュアルによると大量のメソッドを実装しているので、単一クラスでプログ ラムを作成することもできますが、プログラムが複雑になります。
プログラムが実行される際、次のようにメソッドが呼び出されますので、 適宜オーバライドしてプログラムを作成します。
- 起動時に onCreate() メソッドが一回だけ起動されます。
- 次に onStart() メソッドが呼び出されます。 これは、他のアプリケーションに切り替えたときにonStop()が呼ばれ、 再度このアプリケーションに切り替えられた時、onRestart()が呼び出 された後にも呼び出されます。
- onResume()が呼び出されます。これは、画面の一部が隠され、アプリケー ションの操作ができなくなるときに onPause()が呼び出され、再度操作 が戻ってきたときにも呼び出されます。
- さらに、アプリケーションが破棄される時に呼び出される onDestroy() もあります。
このすべてのメソッドをオーバライドする必要はありません。 リアルタイム性のあるゲームなどでは、 onResume でゲームを動かし、 onPause で止めるようにします。 また、他のアプリに移った後、メニューに戻るなどの操作をするときは、 onRestart, onStart を使います。
演習10-1
AdventureSample を取得し、シーンを追加する
プログラムの取得
- File→New→Project From Version Control→Gitを選ぶ
- URLにgit://edu.net.c.dendai.ac.jp/git/spro/10/1を入れ、Clone ボタンを押す
テスト
プログラムを起動し、正常に表示されるかを確認する。 また、途中で Home ボタンを押し、再度プログラムを起動し、 「続きから」を押して元のシーンに戻ることを確認する。 また、言語を英語にして、正常に動作することを確認する。
文字列リソースの追加
Android を Packages に切り替えて、以下のファイルに追記する。
app/values/strings.xml
<string-array name="message3"> <item>Even though I studied hard, it is still difficult for me to understand.</item> <item>I wander it may turn out bad, if I leave this.</item> </string-array> <string-array name="question3"> <item>Ask the teacher.</item> <item>Still study hard by myself.</item> </string-array> <string name="date3" translatable="false">12/18/2014</string>
app/values-jp/strings.xml
<string-array name="message3"> <item>まじめに勉強したけどすっごい難しい。</item> <item>このままじゃまずいかも</item> </string-array> <string-array name="question3"> <item>先生に聞きに行く</item> <item>それでも一人で頑張る</item> </string-array>
画像リーソスの追加
画像ファイル third.pngをダウンロードする。
Packages の画面にし、 app/drawable-hdpi フォルダにコピーする。
scene/GameState.java
second と ending の間に third を入れる。
scene/Third.java
Packages を再び Android に変更して以下の手順を行う。
- scene/Second.java をコピーする
- scene パッケージにペーストするとクラス名を聞かれるので、 Third を指定する(その後 Git に追加するか聞かれるのでyes を選択す る)
- 下記のようにプログラムを変更する。
package jp.ac.dendai.c.jtp.adventuresample.scene; import android.app.Activity; import jp.ac.dendai.c.jtp.adventuresample.R; public class Third extends AbstractScene { public Third(Activity _activity) { super(_activity); } @Override public GameState next(int no) { switch(no){ case 0: return GameState.ending; case 1: return GameState.ending; } return null; } @Override public int getImageId() { return R.drawable.third; } @Override public int getMessageId() { return R.array.message3; } @Override public int getQuestionId() { return R.array.question3; } @Override public int getDateId() { return R.string.date3; } }
scene/Second.java
switch文の中の
return GameState.ending;
を
return GameState.third;
にする。
Game.java
slist の定義の中で、
new Second(mainActivity),
の次の行に
new Third(mainActivity),
を追加する。
この時、scene.Third をimport するか聞かれるので alt+Enter を押して
import jp.ac.dendai.c.jtp.adventuresample.scene.Third;
をファイル冒頭に追加する。
テスト
プログラムを起動し、追加したシーンが正常に表示されるかを確認する。 また、追加したシーンで Home ボタンを押し、再度プログラムを起動し、 「続きから」を押して元のシーンに戻ることを確認する。 また、言語を英語にして、正常に動作することを確認する。
Android Studio が git のプログラムを認識しない
未解決だが、下記のようにすると解決する場合がある
- project window のタブで project を選ぶ
- AdventureSample フォルダの直下に new→File で reimport.bat という名前で新しいファイルを作成する
- 以下を記入する
del *.iml del .idea echo include ':app' > settings.gradle
- AdventureStudio を右クリックして open in terminalを選ぶ
- reimport.bat を開いたterminalで実行し、 .imlファイル、 .idea フォルダを消し、 settings.gradle ファイルを作る
- プロジェクトを閉じる
- new→import project で再び AdventureStudio フォルダを選ぶ