2014年1月9日木曜日

Android API開発用メモ

Android APIについての自分用のメモ
わかったことや気づいたことTipsがあったら随時追記していく

■基本的なソースコードの書き方
  1. activity_main.xml でUIを作成する
  2. Layoutsからレイアウトを決めてレイアウト上にButtonやEditTextを配置していく
  3. Activity側のクラスでtextView = (TextView) findViewById(R.id.textView1);的な感じでUIのオブジェクトを取得して操作する
  4. Buttonを押下した際のアクションはactivety_main.xmlのPropertiesで「On Click」に呼び出すメソッド名を記載すればOK、メソッドはpublic voidで引数にViewのオブジェクトを受け付けるようにすればOK
  5. メソッドを定義するのはActivityを継承しているクラス内で定義する(定義はActivityを継承しているクラスでして実際のロジックは別パッケージの別クラスでもOK

■Activity
画面そのもの
・使い方
public class MainActivity extends Activity {
・・・
}
スマートフォンが画面をスライドさせて次の画面にいくと次のActivityになる、そんなイメージ
Activityには状態があります

活動中や停止中、一時停止などがありそれぞれの状態にあわせて処理を実行することができる
そして使い終わったActivityはonDestroyしないと端末のメモリを逼迫することになるのでちゃんと破棄するようにしよう
(Javaのファイル処理やストリーム処理と同じで終わったオブジェクトはcloseしないといけないということです)

※本家Androidのサイトから拝借

■Intent
Activityを遷移するためのクラス
・使い方
Intent intent = new Intent(this, MeiroActivity.class);
startActivity(intent);

■SharedPreferences
画面間データの受け渡しをするためのKey, Valueのマップ
・使い方
SharedPreferences sharedPref = getSharedPreferences(key, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("key1", "value1");
データを保存する場合はSharedPreferencesオブジェクトからEditorオブジェクトを作成し、そのオブジェクトに保存
データを取得する場合はSharedPreferencesから直接取得する

SharedPreferencesオブジェクトを使用する場合は、それぞれのActivity内でオブジェクトを作成する

データ形式はKey, Valueなので無限に保存することができるが揮発性がありアプリが終了するとデータが失われてしまう
一時的なデータの受け渡しに使う(DBとしては使用しない)

■File
Android内部にファイルを生成し永続的にデータを保存
・使い方
FileOutputStream fos = openFileOutput(filename, Context.MODE_APPEND);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);

FileInputStream is = openFileInput(filename);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
Android独自のopenFileOutputとopenFileInputを使用してオブジェクトを取得したあとに通常のjava.io系のクラスを使えばファイル操作ができます

■DB
Android内部にSqliteDBを作成し永続的にデータを保存
・使い方
DatatradeDBAdapter ddba = new DatatradeDBAdapter(getApplicationContext());
SQLiteDatabase db = ddba.getReadableDatabase();
作成された上記のdbオブジェクトに対してinsertやselect等のSQLを発行することが可能です
DatatradeDBAdapterは独自で作成したクラスで、SQLiteOpenHelperを継承して作成します
DatatradeDBAdapterではテーブルの作成や削除を行うことができるSQLを管理したメソッドを持っています
DBのスキーマを文字列で管理するスキーマクラスを別途作成しておき、それをActivety等で呼び出すようにしましょう
もちろんDatatradeDBAdapter内のCreate Table内でもスキーマクラスの文字列を使ってテーブル作成します

■SurfaceView
ゲームやアニメーションを多用する滑らかに表示するためのView
・使い方
public class MeiroActivity extends Activity implements SurfaceHolder.Callback {

 private SurfaceHolder sh;

 protected void onCreate(Bundle savedInstanceState) {
  ・・・
  SurfaceView sv = (SurfaceView) findViewById(R.id.surfaceView1);
  sh = sv.getHolder();
  sh.addCallback(this);
 }

 public void surfaceCreated(SurfaceHolder holder) {
  drawTest();
 }

 public void drawTest () {
     Canvas canvas = sh.lockCanvas();
     ・・・
     sh.unlockCanvasAndPost(canvas);
 }

}
SurfaceHolderはonCreateで作成し必ずaddCallbackしましょう
Canvasの作成は別メソッドで実施し、surfaceCreatedメソッド内で実際に描画する処理を呼び出します
でないと、Canvasオブジェクトが内部的に作成されてないためにNullPointerExceptionが発生します
http://stackoverflow.com/questions/9510792/lock-canvas-fail-and-canvas-is-null-when-useing-surfaceview

■ImageButton
ボタンに画像を使用することができます
・使い方

ボタンを作成するだけならXMLのみで可能です
何かアクションを実行したい場合にはonClick等を設定し、Java側のソースコードにメソッドを作成するだけでボタンを押下したときに自動でそのメソッドが実行されます
普通のButtonオブジェクトのように作成可能です

■Context
http://individualmemo.blog104.fc2.com/blog-entry-41.html

■Theme.NoTitleBar
Activity上部のタイトルを削除することが可能
・使い方
android:theme=@android:style/Theme.NoTitleBar"
テーマはAndroidManifest.xmlに記載します

■Camera
カメラ機能、インカメラとアウトカメラが使える
・使い方
どうやらエミュレータではカメラ機能は使えないようです
ただ、PCにWebCameraの機能があればそれと連携してカメラを使うことはできるようです
http://wiki.usagee.co.jp/android/%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95

■ArrayAdapter
ListViewにTextView以外を表示する、カスタムする場合に使用する
・使い方
public class ProductListAdapter extends ArrayAdapter<Cell> {

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ...
  }

}
ArrayAdapterを継承した独自Adapterクラスを実装する
ジェネリックの型も自分でPOJOとなるクラス(上記の場合はCellクラス)を作成する
Cellクラスは各ListViewの項目に表示するスタイルを定義したクラスにする
また、cell.xmlみたいな感じでUIも作成する
getViewを必ずOverrideする、getViewは各項目が表示されるたびにコールされる
このgetView内でcell.xmlからオブジェクトを作成して各項目を表示する

■AsyncTask
Androidで非同期を実現するためのクラス、AndroidではUIの描画とHTTP通信などは別スレッドにする必要がある
・使い方
public class AsyncImageViewSetter extends AsyncTask<String, Void, Interger> {

  @Override
  protected Integer doInBackground(String... params) {
    ...
  }

  @Override
  protected void onPostExecute(Integer value){
    ...
  }

}
・呼び出し元
AsyncImageViewSetter image = new AsyncImageViewSetter(str);
image.execute();

AsyncTaskを継承したクラスを作成する
ジェネリックの<String, Void, Integer>はそれぞれ「非同期処理に渡せる型、進行中に更新する値の型、非同期処理終了後に渡す型」になります
doInBackgroundが実際に非同期する部分で上記のジェネリックだとStringの値が配列で渡されます
doInBackgroundが終了すると自動的にonPostExecuteが呼ばれdoInBackgroundの戻り値が渡ってきます
基本的にはUIへの操作はこのonPostExecuteで実施します
他にもonProgressUpdateというメソッドを実装すると非同期の実行中に状況を確認したりすることができます

0 件のコメント:

コメントを投稿