ここではJavaでAndroidアプリを開発するうえで必要になったEclipseの使用方法などをメモっていく。
開発環境を整える
JDK、Eclipse、Pleiades、Android SDKをダウンロードしてインストールしていく
次にEclipseからADTプラグインをインストールする
AVDs(エミュレーター)を作成する
参考サイト日本アンドロイドの会
エミュレータ起動時のエラー
emulator: ERROR: unknown virtual device name: 'Android2.3'
emulator: could not find virtual device named 'Android2.3'
原因は作られたエミュレータの場所がDドライブであるにもかかわらず、Cドライブの方に探しに行っていたことである
解決方法はコマンドプロンプトからディレクトリのどこにandroidを探しに行っているかを確認する
echo %USERPROFILE%
ここで出力されたディレクトリ(C:\Users\~)に.androidがあるかを探す。ない。
こんどは作成したAVDのファイルがどこにできているのかを調べる。
Eclipseを起動。ウィンドウ→Android AVD Managerを起動。作成したAVDの詳細のパスから場所を調べる。見事に(D:\Users\~)にできていた。
ジャンクションを作成して対応する。コマンドプロンプトに
cd %USERPROFILE%
mklink /J .android D:Users\~\.android
これでOKだった
プロジェクトの作成
ファイル-新規-その他
Android-Androidプロジェクト-次へ
プロジェクト名、ビルド・ターゲット、アプリケーション名、パッケージ名、Create Activity、Min SDK Versionを入力して完了
自分だけの決まり事として
ビルド・ターゲットはAndroid2.2
パッケージ名はast.app.~とする
Create ActivityはMainActivityとする
| 項目 | 解説 |
| プロジェクト名 | 作成するプロジェクトの名前 |
| ビルド・ターゲット | 対象とするAndroidのVersion |
| アプリケーション名 | 実際に表示されるアプリケーション名 |
| パッケージ名 | ピリオドで区切った2組以上の文字列で、パッケージ名を指定する。 |
| Create Activity | アプリのアクティビティに付ける名前 |
| Min SDK Version | ビルド・ターゲットで選択したターゲットのAPIレベルに記載されている数字 |
プロジェクトの作成を行うと最初の初期設定ではHello World,Hello(プロジェクト名)をTextViewに表示するようになっている
また、エミュレータの起動には時間がかかる(1~5分)ので途中で終了しないように注意する
エミュレータで実行したアプリケーションはアイコンで中に残っているので、アイコンをクリックすると再度アプリケーションを実行することができる
参考サイト日本アンドロイドの会
エミュレータの作成
エミュレータはAVDマネージャーで作成しておく必要がある。
ウィンドウ>Android SDKおよびAVDマネージャー
でAndroid SDKおよびAVDマネージャーのダイアログが起動する
Virtual devices>新規
でCreate new Android Virtual Device(AVD)ダイアログが開く
表を参考に各項目の値を入力、選択する
| 項目名 | 設定内容 | 備考 |
| 名前 | エミュレータの名前 | 必須 |
| ターゲット | エミュレータで実行するシステムのバージョン | 必須 |
| SD Card | エミュレータで使用するSDカードのサイズ | 任意 |
| Skin | エミュレータの画面寸法の指定 | 任意 |
| ハードウェア | エミュレータに追加するハードウェアエミュレーション | 任意 |
Skin
| 略称 | 解像度 |
|---|---|
| QVGA | 240×320 |
| WQVGA | 240×400 |
| FWQVGA | 240×432 |
| HVGA | 320×480 |
| WVGA | 480×800 |
| FWVGA | 480×854 |
ハードウェア
センサーの有無やカメラの解像度などを指定する
特定のセンサーなどを扱うアプリケーション以外では、何も指定せずデフォルト設定で無問題
「yes」「no」や数値などで指定
| プロパティー | 値 | 解説 |
|---|---|---|
| SD Card Support | yes,no | SDカードの抜き差しを検出するか |
| Abstracted LCD density | 120,160,240 | ディスプレイの絶対密度 |
| DPad support | yes,no | ダイヤルパッドキーの有無 |
| Accelerometer | yes,no | 加速度センサーの有無 |
| Maximum horizontal Camera pixels | yes,no | カメラの水平解像度(整数) |
| Cache partition size | 数値 | キャッシュパーティションのサイズ |
| Audio playback support | yes,no | 音声出力の有無 |
| Track-ball support | yes,no | トラックボールの有無 |
| Maximum vertical camera pixels | 数値 | カメラの垂直解像度(整数) |
| Camera support | yes,no | カメラの有無 |
| Battery support | yes,no | バッテリで動作するか |
| Touch-Screen support | yes,no | タッチスクリーンかどうか |
| Audio recording support | yes,no | 音声入力機能の有無 |
| GPS support | yes,no | GPSの有無 |
| Cache partition support | yes,no | キャッシュパーティションをサポートするかどうか |
| Keyboard support | yes,no | フルキーボードの有無 |
| Max VM application heap size | 数値 | VMのアプリケーション用ヒープサイズをMB単位の整数で指定 |
| Device ram size | 数値 | 物理メモリの量をMB単位の整数で指定 |
| GSM modem support | yes,no | GSM(携帯電話モデム)の有無 |
入力後にCreate AVDをクリック
デバッグ
Androidアプリケーションのデバッグを実行すると、Eclipse とエミュレータの接続待ちに入る
接続待ち中にForce Closeボタンを押すと、デバッグやアプリの起動が中断されるので注意する。
他にもコンパイル中のデバッグによる不具合は処理能力の低いコンピュータなどで発生し、アプリケーションの転送に失敗しデバッグできない時がある。
また、実機でのデバッグにはAndroidManifest.xmlのapplicationタグでandroid:debuggable="true"を設定しておく必要がある
ブレークポイントの設定
src-パッケージ名-MainActivity.javaをJavaエディタで開いてブレークポイントを設定する
プログラムをやめたい箇所をダブルクリックか、実行-ブレークポイントの切り替え
デバッグの実行
実行-デバッグの構成
名前、プロジェクトを確認-デバッグ
デバッグパースペクティブに切り替える
ブレークポイントの箇所にプログラムの実行が到達すると、実行が中断される
パースペクティブ切り替えの確認ダイアログの表示-はい
実行直前の箇所に矢印が表示される
プログラムを進める
デバッグツール-ステップオーバー
もしくは
実行-ステップオーバー
コンパイルエラー
文法エラー:Javaのプログラムにエラーがある場合に発生する。
定義ファイルエラー:レイアウトファイルや、その他の定義ファイルにおいてXMLの文法に誤りがある場合に発生する。
リンクエラー:Javaのバージョンを変更したときや、Android SDKのフォルダを変更したときに発生する。
エミュレータ実行時のエラー
ファイルの保存時にエラーが出ないのに、エミュレータで実行できない
レイアウトのタイプミスかAndroidManifestに追加したActivityの登録を忘れているか、が多い
レイアウトの編集
レイアウトの編集はres-layout-main.xmlから編集できる
レイアウトの編集画面は2つのタブがあり、Graphical Layoutタブではグラフィカルな編集画面、XMLファイル面のタブではXMLファイルのソースを直接編集するテキストエディタ画面が表示される
色設定XMLファイルの作成
res/valuesの下にcolor.xmlを作成する
直接XMLファイルを編集することもできるが、リソースタブから
追加-Color-OK-Name、Value-保存でResouces ElementsにColorが追加される
@color/blackで呼び出せるようになる
<resouces> <color name="black">#000000 </resources>
ボタンの配置
ボタンを配置
ラベルの定義
押されたときの処理
参考サイト:日本アンドロイドの会、素人のアンドロイドアプリ開発日記
Buttonの色や画像
単純な方法
Buttonタグのパラメータで
android:background="#ff00ff"で色の変化
android:background="@drawable/button"で画像の変化
でできる
しかし、このやり方ではボタンが押された場合やフォーカスされた場合に変化ができない
そういった場合をやりたい場合は参考サイトへ
参考:Y.A.Mの雑記帳
Buttonにおけるクリック時のイベント処理
Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
//クリック時の処理
}
});
ビューの配置
LinearLayoutで決める
配置したいものをLinearLayoutで挟む
android:orientationの属性によって横、縦を決める
なし、horizontalで横に
verticalで縦に並べることができる
背景の設定
res/drawable-mdpiに用意した画像ファイル(480×800)をドラッグしてコピー
LinearLayout-プロパティー-...-Drawable-画像ファイル-OK
画面の向きによって背景を切り替える
横向き画面用の画像(800×480)を用意する
res/drawable-land-mdpiに用意した画像をドラッグしてコピー
layout-landという名前のフォルダにmain.xmlを格納しておけば、レイアウトごと切り替えることも可能
画面をタッチすると背景を切り替える
もう1つの画像を用意する。
画像のファイル名は前のものとは異なるようにし、同じフォルダへいれる。
LinearLayoutとTextViewにはIDがセットされないのでIDを追加する
追加の方法はレイアウト編集画面でLinearLayoutを選択し、プロパティーでIdに@+id/layoutと入力する。
src/パッケージ名/アクティビティ.javaのファイルをダブルクリックするとソースコードを開ける。
あとはcounterを初期値1で設定して、クリックされたらcounterをみて1であれば背景とcounterを2に変えて、counterがそれ以外であれば背景とcounterを1に変える。画像の表示はクリックされる前から1が表示されているのでクリックされると2に変わることになる。下がプログラム例。

プログラムを追加したらレイアウト編集画面でlayoutを選択して、プロパティーのOn clickにonClickと入力すれば完成
Javaプログラムの説明をすると、
レイアウト上のLinearLayoutをfindViewByIdメソッドを使用して変数layoutに格納
if~elseステートメントでcounterの数値によって場合分け
setBackgroundResourceメソッドを使用してレイアウトの背景画像を設定し直す
その後にcounterの数値を切り替える
ボタンを押して戻る
XMLファイルのボタンプロパティに
android:id="@+id/~" android:onClick="onClickButton">
でボタンを押してのイベントをできるようにする
動作内容をJavaファイルに記す
Button ~ = (Button)findViewById(R.id.~);
~.setOnClickListener(new OnClickListener(){
public void onClick(View ~){
finish();
}
});
finish()は1つ前のアクティビティに戻る
ボタンを押して複数のActivityを終了
1.System.exitを使用する方法
System.exit(RESULT_OK);
2.ActivityManagerを使用する方法
ActivityManager am =
(ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
Menuを押して別の画面に移動
遷移先のActivityとxmlファイルを作成する
プロジェクト名/src/パッケージ名の下にjavaファイルを作成する
新規-クラスで新規Javaクラス画面を表示
ソース・フォルダーにプロジェクト名/src
パッケージにパッケージ名
名前にクラス名
スーパークラスにandroid.app.Activity
を入力して完了するとOK
プロジェクト名/res/layoutの下にxmlファイルを作成する
新規-Android XML Fileを選択し作成する
AndroidManifest.xmlに遷移先のActivityを追加する
applicationの中に
<activity android:name="クラス名"></activity>
メニューの表示と選択時の処理
MainActivity.javaを編集
private final int MENU_ID1 = Menu.FIRST;
private final int MENU_ID2 = Menu.FIRST + 1;
でIDを宣言している
Menu.FIRSTはメニューの一番最初のIDで、以降は+1をする
onCreateOptionsMenu(Menu menu)でメニューを作成
android.view.Menu.add(int groupId,int itemId,int order,CharSequence title)を使用して、メニューを追加
groupId:グループのID
itemId:アイテムID
order:アイテムの順序
title:メニューに表示されるタイトル
.setIcon(android.R.drawable.ic_menu_crop);
の部分でメニューに表示するアイコンを設定
onPrepareOptionsMenu(Menu menu)
はメニューボタンが押されたときの処理
trueを返すとメニューが表示され、falseを返すとメニューが表示されない
onOptionsItemSelected(MenuItem item)
はメニューが選択されたときの処理
選択されたメニューごとに処理を記述する
Activityの遷移やアプリケーション間の遷移にはIntentを使用
setClassName(String packageName,String className)
に遷移先パッケージ名とクラス名を指定して、
startActivity()
でActivityを実行する
finish()
でActivityを終了
NextActivity.javaを編集
ボタンを押して画面の遷移
画面1から画面2にボタン1を押して画面2に、ボタン2を押して画面3にいくとする
まず画面1、2、3のそれぞれに対応するActivity(src下のJavaファイル)とレイアウト(res/layout下のxmlファイル)を用意する
画面1のレイアウトにボタン1を、画面2のレイアウトにボタン2を設置
もちろんボタンのイベントは用意する(android:onClick="onClickButton")
画面1、2のActivityにボタンの動作を記す
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//↓ボタンのイベント処理
Button b1 = (Button)findViewById(R.id.button1);
b1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
//↓MainActivityからSecondActivityを呼び出す
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//↓アクティビティの起動
startActivity(intent);
}
});
}
}
AndroidManifest.xmlにActivityを追加(画面1はプロジェクト作成時にされているので、画面2、3のActivityを登録する)
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" android:label="@string/app_name">
</activity>
<activity android:name=".ThirdActivity" android:label="@string/app_name">
</activity>
<activity android:name=".LastActivity" android:label="@string/app_name">
</activity>
</application>
乱数の利用
import java.util.Random; Random r = new Random(); int n = r.nextInt(値);
Javaではjava.util.Randomがランダムな値を生成するクラスとして用意されている
このインスタンスを得るためにnew演算子を使う
整数のランダムな値を得るためにnextIntメソッドを使う
nextIntメソッドは0からパラメータ-1のランダムな値が返ってくる
つまりr.nextInt(1)であれば0しか返らない
ゆえにパラメータはランダムのなりうる個数ということになる
画面の向きの固定
AndroidManifest.xml-アプリケーション-Application Nodes-各Activity-Attributes for (Activity)
Screen orientationをportrait(縦に固定)もしくはlandscape(横に固定)に
Config changesをkeyboardHiddenとorientationに
オプションメニュー
MENUボタンを押すとオプションメニューが表示される
オプションメニューはXMLファイルで定義できる
ActivityのonCreateOptionsMenuメソッドで動的に生成もできる
@Override
public boolean onCreateOptionsMenu(Menu menu){
// メニューアイテムを追加する
menu.add(Menu.NONE,MNU_PREF,Menu.NONE,"設定");
return super.onCreateOptionsMenu(menu);
}
Menuクラスのaddメソッド
| パラメータ | groupId | 親のメニューのID、必要なければNONEを指定 |
| itemId | メニューのID(あとで処理をするときに必要) | |
| order | メニューの並び順、必要なければNONEを指定 | |
| title | メニューの表示名 | |
| 戻り値 | MenuItem | 追加されたメニュー |
onOptionsItemSelectedメソッドの実装例
アプリの終了
アプリの終了には複数のやり方がある
finish()
Activityを閉じる際の最良の終了方法である
アプリケーションの起動Activityで呼び出した場合はアプリケーションを終了する
バックボタンを押したときと同じ動きで1つのアクティビティを利用する場合のみ使える
moveTaskToBack(true)
アプリケーション全体を終了する際の推奨される終了方法
アプリケーションを中断状態にする
ホームボタンを押したときの動作と同じ動き
その他
AndroidManifest.xml で <activity android:noHistory="true">オプションを指定して finish() する
noHistory="true"を指定しておくとアクティビティのスタックがなくなる事を利用する方法です
?同一アプリケーションのActivity間でのIntentのやりとり
例ではActivity1での数値をActivity2で表示するもの
Activity1.java
~省略~
String str = String.valueOf(cnt); // cntを文字列に変換
Intent it = new Intent(); // Intentの作成
it.setClass(this, Activity2.class); // 明示的Intentを設定、thisからActivity2を指定
it.putExtra("text", str); // 文字列を追加情報に設定
startActivityForResult(it, REQUEST_CODE); // Intentの発行
Activity2.java
~省略~
Intent it = getIntent(); // Intentの取得
mText = it.getStringExtra("text"); // 送られてきた文字列を取得、textはActivity1、2で共通のキー
setContentView(R.layout.activity2view);
TextView tv = (TextView) findViewById(R.id.view_tv);
tv.setText(mText); // 文字列を表示
ViewFlipper
↓main.xml

↓MainActivity.java

バイブ機能
AndroidManifest.xmlの許可タブでUsespermissionを追加、Nameにandroid.permission.VIBRATEを指定
追加するインポート宣言:import android.os.Vibrator;
メソッドに追加する内容:((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(50);←簡単
vibrate(50)は50msの振動時間を示す
もしくは
private Vibrator vib;←変数の設定
vib=(Vibrator)getSystemService(VIBRATOR_SERVICE);
vib.vibrate(100000);←振動オン
vib.cancel();←振動オフ
BACKボタンでアプリが死なない場合
onDestroyが実行されていないのが原因っぽい
onDestroyをしっかり明示してあげると、しっかり死んでくれるよう
