概要

  • Android での少し実用的な Hello, world! アプリ
  • Android Studio でスケルトン作れば Hello World! と出るけど、resouce 出してるだけで変化させれないので、ボタン押したら出す、APIコールの結果とか入れればそれが出る、ぐらいのもの
  • テスト用にいつも使うのでコピペするよう

詳細

  • スケルトン作成

    • Android Studio → File → New → New Project… → 適当にアプリ名とパッケージ名を入れて → Next → API レベルを適当に選んで Next
      → Empty Activity を選んで Next
      → Finish (MainAcivity は名前を変えておいた方が後々検索するときに楽)
  • public class MainActivity extends Activity とかの下に追加
    最近は extends AppCompatActivity か

    private ArrayAdapter<String> mAA;
        
    private void log(final String str) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mAA != null) {
                    mAA.add(str);
                }
            }
        });
    }
    
  • setContentView() をコメントアウトして、コードで View を生成(ボタンとリストビュー)

    // setContentView(R.layout.activity_main);
        
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    setContentView(ll);
        
    Button btn = new Button(this);
    btn.setText("test");
    ll.addView(btn);
        
    mAA = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    ListView lv = new ListView(this);
    lv.setAdapter(mAA);
    ll.addView(lv);
        
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            log("Hello, world!");
        }
    });
    
    

結果

  • ボタンとリストビューだけのアクティビティが作成され、ボタンを押すとリストビューに Hello, world! が追加される
  • (あとでスクリーンショットを貼る)

簡単な応用

  • log(文字列) でリストビューに出力される

  • onClick() の中で Context を参照するときは <クラス名>.this を使う

    Toast.makeText(MainActivity.this, "message", Toast.LENGTH_LONG).show();
    

    onClick() の中は UI Thread なので、Toast など GUI を触っても大丈夫(時間かかるのはダメだが)

  • 簡易的に別スレッドで実行したい場合
    時間のかかる処理は UI Thread ではやってはいけない。固まる。5秒(?)以上固まるとANR発生する。
    Thread に Runnabule な instance を渡して start() すれば別 Thread で実行してくれる。

    (new Thread(new Runnable() {
        @Override
        public void run() {
            // ここは UI Thread ではないので GUI 触れない
            final String str = foo();   // 時間のかかる処理
            log(str);  // 中で runOnUiThread() してるので問題なし
                
            // runOnUiThread() に GUI 触る Runnable なインスタンスを渡してあげれば UI Thread 上で実行してくれる
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, "message", Toast.LENGTH_LONG).show();
                }
            }
        })
    ).start();
    

まとめ

  • ちょっとしたテストに使える Hello World になった。か?