Page Last

ここでは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

略称解像度
QVGA240×320
WQVGA240×400
FWQVGA240×432
HVGA320×480
WVGA480×800
FWVGA480×854

ハードウェア

センサーの有無やカメラの解像度などを指定する
特定のセンサーなどを扱うアプリケーション以外では、何も指定せずデフォルト設定で無問題
「yes」「no」や数値などで指定

プロパティー解説
SD Card Supportyes,noSDカードの抜き差しを検出するか
Abstracted LCD density120,160,240ディスプレイの絶対密度
DPad supportyes,noダイヤルパッドキーの有無
Accelerometeryes,no加速度センサーの有無
Maximum horizontal Camera pixelsyes,noカメラの水平解像度(整数)
Cache partition size数値キャッシュパーティションのサイズ
Audio playback supportyes,no音声出力の有無
Track-ball supportyes,noトラックボールの有無
Maximum vertical camera pixels数値カメラの垂直解像度(整数)
Camera supportyes,noカメラの有無
Battery supportyes,noバッテリで動作するか
Touch-Screen supportyes,noタッチスクリーンかどうか
Audio recording supportyes,no音声入力機能の有無
GPS supportyes,noGPSの有無
Cache partition supportyes,noキャッシュパーティションをサポートするかどうか
Keyboard supportyes,noフルキーボードの有無
Max VM application heap size数値VMのアプリケーション用ヒープサイズをMB単位の整数で指定
Device ram size数値物理メモリの量をMB単位の整数で指定
GSM modem supportyes,noGSM(携帯電話モデム)の有無

入力後に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をしっかり明示してあげると、しっかり死んでくれるよう