魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

Androidアプリ開発環境の構築

投稿日:
修正日:
タグ:

本稿はEclipseという統合開発環境を使ったAndroid用アプリの開発環境の構築についてのメモである.

はじめに

以下に実行環境を示す.

実行環境
CPUIntel(R) Celeron(R) M CPU 520 @ 1.60GHz
メモリ1024MB
OSDebian Linux7.1.0
Eclipse3.8
ADT(Android Developer Tools)22.3.0-887826
ハードウェアNexus 7
Android4.2
カーネル3.1.10-g22b4fcd

Android SDK

入手と解凍

Android開発用のEclipseは下記のサイトから入手できる.

Eclipseはzipで圧縮されている.

入手したzipファイルは解凍することで利用する.解凍するコマンドには次のようなコマンドがある.

user% unzip adt-bundle-linux-x86-20130917.zip
解凍したディレクトリには,Eclipseが含まれている.このプログラムは次のように起動すれば良い.
user% ./adt-bundle-linux-x86-20130917/eclipse/eclipse

Eclipse

ここでEclipseについて改めて紹介する.Eclipseとは統合開発環境(IDE)の一種である.統合開発環境とは,コンパイラやエディタ,デバッガなどを1つの1つの環境から利用できるようにしたもののことである.Eclipseは標準でJavaをサポートするが,プラグインを組み込むことで様々なプログラミング言語をサポートする.EclipseでAndroidアプリをサポートしたい場合,ユーザはEclipseにAndroid Development Tools(ADT)というプラグインを取り込めば良い.ちなみにEclipse自体はJavaで記述されているため,クロスプラットフォーム(さまざまなOSで実行可能)なアプリケーションである.

Eclipseの起動

Eclipseを起動すると,次のように作業環境のパスの指定を求められる.

Eclipseで作成されたファイルはここをルートとして作られていく.

ADTのインストール

入手したEclipseはこのままでは必要なプラグイン(ADT)が入っていないことがある.これをインストールするには,次のように行う.

  1. [Help]を選択.
  2. [Install new software...]を選択.
  3. "Work with"に"http://dl-sll.google.com/android/eclipse/"を指定.
  4. "Developper Tools"をチェック.
  5. [Next >]を選択して次のページへ.
  6. インストールするものの一覧を確認して[Next >]を選択して次のページへ.
  7. [I accept the terms of the license agreements]をチェック.
  8. [Finish]を選択してインストールを行う.

以上でエディタやコンパイラなどの必要なツールがインストールされる.

Androidマシン・エミュレータ

ADTにはテスト用のAndroidエミュレータを生成する機能が付いている.エミュレータを使いたい場合,ユーザはメニューバーの[Window]から[Android Virtual Device Manager]を選択する.

エミュレータは,[New...]を選択し,"AVD Name"と"Device"を指定することで生成できる."AVD Name"はエミュレータの名前,"Device"はエミュレーションするAndroidマシンのことである.

Androidマシンの設定

Javaで作られたエミュレータはCPUへの負担が大きい.それゆえ私は基本的に実際のハードウェアで直にテスト実行している.なお私が使っているAndroidマシン(Nexus 7)は,標準で開発システムのOSから認識できたが,Eclipseから認識できず,以下の設定が必要だった.

  1. [開発者向けオプション]を表示.
    1. [設定]を起動.
    2. [ビルド番号]を数回タップ.
  2. USB接続時にデバッグモードに設定.
    1. [開発者向けオプション]をタップ
    2. [USBデバッグ]をチェック

以上まででAndroidアプリを開発するための準備は完了である.

Androidアプリ生成 -Hello, World!-

投稿日:
タグ:

目次

本稿はEclipseでAndroidアプリンをクロス開発し,Android端末で動かすまでの話のメモである.

Androidアプリ プロジェクトの立ち上げ

名前と各種APIのバージョンの設定

はじめに,アプリケーション名とプロジェクト名,パッケージ名,各種APIのバージョンを指定.

プロジェクト名は標準ではアプリケーション名と同じ名前を付けられる.各種APIは作成するアプリケーションがどのAndroid OSを対象としたものかを指定する.これはAndroid OS毎に対応するAPIが違うためである.

次に進むとこのような画面が表示される.

この画面は標準設定のまま次に進むことができる.

ここではプロジェクトで使用するファイルのパスやアクティビティを生成するか否かを指定する.アクティビティについての詳細は後述する.

アイコンの設定

次に進むと,アプリケーションのアイコンの設定を行う.アイコンには画像やテキスト,マークなどを使用でき,背景色やテキストやマークの色を指定できる.

アクティビティの設定

最後にアクティビティの設定を行う.アクティビティとは画面の土台のようなものである(正しくは画面だけを管理する訳ではない).アプリケーションは1つ以上のアクティビティによって構成される.Androidアプリは基本的にアクティビティに対してボタンや画像などのウィジェットを追加してくことで作成する.

アクティビティの設定には2段階ある.まず1段階目はテンプレートの選択である.

ADTでは,いくつかのアクティビティのテンプレートが用意されている.テンプレートを使用しない場合,アクティビティを生成しないようにチェックを外すか,選択したテンプレートから余計なコードを消せば良い.
Blank Activity右上のメニューとテキストだけが表示されているテンプレート
Fullscreen Activityメイン画面にタッチするとメニューが隠れて全画面表示になるテンプレート
Master/Detail Flow左側に見出しがあり,それを選択すると右側の画面が変化するテンプレート

次に進むと,アクティビティの名前やレイアウトの名前を指定する.

"Blank Activity"の場合,さらに細かく設定できる.選択肢には次のようなものがある.
  • None
  • Fixed Tabs + Swipe
  • Scrollable Tabs + Swipe
  • Dropdown
これらの詳細については本稿では言及しない.

全ての設定が完了したら,[Finish]をクリックすることでプロジェクトのひな形が生成される.


アプリケーションの実行

本稿では内容の変更については言及しない.生成されたアプリケーションは次のようにして実行する.

  1. [Run]を選択.
  2. [Run]を選択.
  3. "Android APlication"を選択.
  4. [OK]を選択.
  5. 実行するデバイスを選択.
  6. [OK]を選択.
この例では実行するデバイスが1つしかないが,エミュレータを生成すると更に選択肢が増える.

実行画面を以下に示す.

Androidアプリ アクティビティとビュー

投稿日:
タグ:

目次

本稿では,ADTに生成されたばかりで何も機能を持たないAndroidアプリのソースコードの説明を行う.

Androidアプリ・プロジェクトの構成要素

プロジェクトを立ち上げると,生成されるファイルやディレクトリについて紹介する.とりあえず最初に理解しなければならない要素はこれらである(私見である).

AndroidManifest.xmlアプリケーションの情報や基本設定を記述したファイル
srcソースコードを格納するディレクトリ
res文字列やファイルなどの資源などを格納するディレクトリ.
layoutアクティビティの画面を表すファイルを格納するディレクトリ
values整数や文字列などの値を保持するファイルを格納するディレクトリ
menuメニュー画面を表すファイルを格納するディレクトリ
drawable 解像度毎に画像を格納するディレクトリ郡.
drawable-ldpi
低解像度なディスプレイ用の画像を格納するディレクトリ
drawable-mdpi
中解像度なディスプレイ用の画像を格納するディレクトリ
drawable-hdpi
高解像度なディスプレイ用の画像を格納するディレクトリ
drawable-xdpi
より高解像度なディスプレイ用の画像を格納するディレクトリ
drawable-xxdpi
最大限高解像度なディスプレイ用の画像を格納するディレクトリ
rawアプリケーション内で使用するファイル(例:テキストファイルやバイナリファイル)を格納するディレクトリ
本稿ではここで挙げたリソースのうち,見た目を司るもの(ビュー)をいくつかを紹介する.そして,それらとプログラムの対応付けについて説明する.

前述で紹介したもの以外にもさまざまなファイルやディレクトリが生成される.以下にその一部を紹介する.

genADTが使用するディレクトリ
libsライブラリを格納するディレクトリ
bin実行ファイルを格納するディレクトリ
これらやここで紹介しなかったディレクトリやファイルは,プログラマがあまり意識する必要がないものや,簡単なアプリケーションでは使用しないものである.

ソースコード

Androidアプリがプログラムである以上,ソースコードがあるのは当然である.AndroidアプリはJava言語で記述される.一般的なJavaの言語処理系は,純粋なマシン語ではなく,Java仮想マシンで動くコードにコンパイルする.ただし,Androidアプリを動かすDalvik仮想マシンは純粋なJava VM向けのバイナリコードは実行できない.Dalvik仮想マシンに関する詳細はここでは言及しない.また,Javaの言語仕様についてもここでは言及しない.

Androidアプリケーションを実行すると,AndroidManifest.xmlで設定したアクティビティクラス(あるいはそれを継承したクラス)のインスタンスを生成し,onCreate関数が呼び出す.

package com.example.test1;

public class MainActivity extends android.app.Activity {
        @Override
        protected void onCreate(android.os.Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
		/*
		  追加コード
		*/
        }
}

アクティビティの状態遷移図を以下に示す.

リソース

リソースには3種類ある.

  • リソースをXMLで表現したもの
  • 格納されたファイル自体がリソースであるもの
  • 2つを兼ね揃えたもの
valuesは1つ目で,drawableやrawは2つ目,layoutやmenuは3つ目に属する.全てのリソースには名前があり,それらはプログラム内で整数型のデータの変数名として扱われる.これらの変数はADTによって自動生成され,それぞれ一意に定まる値が割り当てられる.そのため,新たにリソースを使用する場合,Eclipseの機能で追加するべきである(そうでなければ整合性がとれなくなるかもしれない).また,ファイル自体がリソースの場合,ファイル名から拡張子を除いたものがリソース名,つまり変数名になる.

layout

アクティビティの画面を形成するためのリソースをレイアウトという.レイアウトを使用せずにアクティビティを生成することは可能であるが,特別な意図がなければレイアウトを使った方が簡潔である.

アクティビティとレイアウトを対応付けるには,setContentView関数を使用する.初期画面のレイアウトをアクティビティに対応づけるには,onCreate内で呼び出せば良い.

package com.example.test1;

public class MainActivity extends android.app.Activity {
        @Override
        protected void onCreate(android.os.Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        }
}
レイアウトの変数はR.layoutに属する.なお変数の名前はレイアウトファイルのファイル名から拡張子を除いたものである.

ADTプラグインを含むEclipseでは,レイアウトの生成をテキストベースだけでなく,GUIで行うことができる.レイアウト生成ツールの画面は,次の4種類からなる.

  • アクティビティのレイアウト
  • アクティビティ上のビューの階層図
  • パレット ビューのテンプレート一覧
  • 各ビューのプロパティ(名前や色,サイズなどの情報)
用意されたビューのテンプレートはさまざまで,ビューの種類以上に多くのテンプレート用意されている(例えば文字付きボタンも文字の大きさでいくつか用意されている).また,ビューのプロパティのほとんどはプログラム内からも変更できる.

レイアウトはビュー(View)という見た目を司る要素の1つである.次に紹介するメニューもまたこの1つである.

menu

Androidアプリの右上にメニューを設置する場合,アクティビティの次の関数を定義すれば良い.

        @Override
        public boolean onCreateOptionsMenu(android.view.Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
メニューはres/menu/内のXMLファイルで定義される.メニューの変数はR.menuで定義される.そして,getMenuInflater().inflate()でプログラムとメニューを対応づけることができる.

menuの作成は単純である.menuはいくつかの項目と項目のIDと表示される文字列からなる.新たに項目を追加したい場合,itemを追加しそのidと値を設定するだけで良い.

Androidアプリ ウィジェットとイベント

投稿日:
修正日:
タグ:

目次

ウィジェット

ウィジェットとは,簡単にいえばGUIを構成する要素のことである.Androidでは,ホーム画面から直接操作をできるものをウィジェットと呼ぶが,ここでいうウィジェットはそのウィジェットとは別のものである.

ウィジェットの追加はレイアウトのエディット画面で行える.そして,ウィジェットのidやサイズなどの情報もまたそこで編集できる.

以前紹介したTest1プロジェクトのレイアウトにボタンを追加した画面は次の通りである.

id役割
textandroid.widget.TextView文字列を表示するウィジェット
buttonandroid.widget.Buttonただのボタンのウィジェット

イベント

次のソースコードは,ボタンをクリックしたら(押してそのまま離したら)表示されている文字列"Hello, World!"が"hoge"に変更されるプログラムのものである.

package com.example.test1;

public class MainActivity extends android.app.Activity {
        private android.widget.TextView txt;
        private android.widget.Button btn;

        class MyClickHandler implements android.view.View.OnClickListener{
		@Override
		public void onClick(android.view.View v){
	        	txt.setText("hoge");
		}
	}

        @Override
        protected void onCreate(android.os.Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
		
                MyClickHandler my_chandler = new MyClickHandler();
                txt = (android.widget.TextView)findViewById(R.id.text);
                btn = (android.widget.Button)findViewById(R.id.button);
		btn.setOnClickListener( my_chandler );
        }
}
ウィジェットはレイアウトで定義できる.そして,これをプログラムで利用するにはfindViewById()を使用する.ウィジェットの変数はR.idに属する.

ウィジェットが押されたり触られたりすることをイベントという.イベントに応じて何らかの処理を行うには,イベントリスナーと呼ばれるものをセットすれば良い.前述のサンプルでは,ボタンウィジェットにクリックリスナー(あるいはそれを継承したクラスのインスタンス)を対応付けている.

ウィジェットのプロパティやイベントに対応する関数をセットするには,setから始まる名前の関数を使用する.また,それを取得する関数の多くはgetから始まる名前の関数である.これらの関数の詳細については,公式のAndroid APIのリファレンスマニュアルやEclipseの補完機能の情報を参照されたい.

もう1つイベントハンドラをセットする例を紹介する.

        class SettingMenuItem implements android.view.MenuItem.OnMenuItemClickListener {
                @Override
                public boolean onMenuItemClick(android.view.MenuItem item)
                {
        		txt.setText("setting");
		}
        }

        @Override
        public boolean onCreateOptionsMenu(android.view.Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
		android.view.MenuItem item = menu.getItem(0); // 1番目の項目
                SettingMenuItem setting = new SettingMenuItem();
                item.setOnMenuItemClickListener(setting);
                return true;
        }

values,drawable

前述のサンプルでは"hoge"という文字列リテラルを記述しているが,Androidアプリは多言語に対応するための仕組みがある.Androidでは数や文字列をres/values内のXMLファイルで定義することで,それを利用できる.そして,対応する言語に応じてvaluesファイルを使い分けることで,複数の言語に対応したプログラムになる.また,valuesで定義された数や文字列は,他のXMLファイルで使用することができる.これにより,コーディングと同じでファイルの修正が容易になる.

XMLファイルでvaluesの値を使用したい場合,次のようにして記述すれば良い.

android:label="@string/app_name"
また,プログラム内で利用したい場合,次のようにする.
android.content.res.Resources r = MainActivity.this.getResources();
String str = r.getString(R.string.hoge);
txt.setText(str);
文字列に限らず整数や小数,配列,画像(drawable)などについても基本的には同じ考え方である.

Androidアプリ raw

投稿日:
修正日:
タグ:

raw

Androidアプリのリソースには,テキストやバイナリなどの生のデータがある.それらのデータはresのrawというディレクトリに格納される.rawへのファイルの追加はEclipseの機能を用いてコピーしたり生成したりすることが望ましい.これはEclipseがリソース情報を管理していることに起因する.

        String[] lines;
        try {
                int i = 0, cnt = 0;
		android.content.res.Resources resource = getResources();
                java.io.InputStream is = resource.openRawResource(R.raw.text);
                while (is.read()!=-1) cnt++;
                byte [] b = new byte[cnt+1];
                is.reset();
                is.read(b);
                String str = new String(b);
                lines = str.split(";");
                is.close();
        }catch(java.io.IOException e){
                
        }

Androidアプリ タイマとハンドラ

投稿日:
タグ:

本稿はAndroidアプリ開発でjava.util.Timerを使った際のメモである.

Android APIとタイマ

Javaではタイマ(java.util.Timer)を使って一定時間毎に特定の処理を行うことができる.しかしタイマ内で,直接アクティビティ内のウィジェットの情報を書き換えることはできない(私の環境では何故かProgressBarは上手くいったが…).このようなコードはコンパイル可能だが,タイマ内の処理でウィジェットの値を書き換えようとした瞬間,アプリがエラー終了する.これを解決するには,android.os.Handlerのインスタンスを使用すれば良い.これを含め,タイマには次の4つのクラスを使用する.

  • java.util.Timer
  • java.util.TimerTask
  • android.os.Handler
  • java.lang.Runnable

java.util.Timer

はじめにjava.util.Timerを使ったサンプルを紹介する.

class Hoge {
	private java.util.Timer timer;

	private class MyTimerTask implements java.util.TimerTask{
 	 	int time_cnt = 0;
                @Override
                public void run()
                {
                        time_cnt++;
                        System.out.println(time_cnt);
			if (time_cnt==10){
			        timer.cancel();
			}
                }
        }
        Hoge()
        {
                timer = new java.util.Timer(true);
                MyTimerTask ttask = new MyTimerTask();
                timer.schedule(ttask, 60000, 60000);
	}
}
java.util.Timerのインスタンスはschedule関数を使用して,ある処理を定期的に実行できる.scheduleの引数はそれぞれ次の通りである.
schedule(java.util.TimerTaskのインスタンス, 最初に実行されるまでの時間, どれぐらい間を置いて実行するか)
時間はミリ秒単位で指定する.

java.util.Timerのインスタンスはcancelを呼び出すことで終了する.

timer.cancel();
終了したタイマはもう一度scheudleを呼び出しても起動できず,再度処理を行うには新たにインスタンスを生成しなければならない.

java.util.Timerとandroid.os.Handler.

以下に実際のサンプルコードを示す.

public class MainActivity extends android.app.Activity {
	private android.widget.TextView text;
	private java.util.Timer timer;
	private final android.os.Handler HANDLER = new android.os.Handler();
	
	private class MyRunnable extends java.lang.Runnable {
	        private Integer time_cnt = 0;
                @Override
                public void run()
                {
			time_cnt++;
        	        text.setText(time_cnt.toString());
			if (time_cnt==10){
        			timer.cancel();
				finish(); // アクティビティの終了
			}
                }		
        }

	private class MyTimerTask extends java.util.TimerTask{
 	 	MyRunnable RUNNABLE = new MyRunnable();
                @Override
                public void run()
                {
                        HANDLER.post(RUNNABLE);
                }
        }
        protected void onCreate(android.os.Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                timer = new java.util.Timer(true);
                MyTimerTask ttask = new MyTimerTask();
                timer.schedule(ttask, 60000, 60000);
                }		
        }
このようにMyTimerTaskクラスのrun関数で,android.os.handlerインスタンスのpost関数を呼び出し,引数にjava.lang.Runnable(あるいはそれを継承した)クラスのインスタンスを与える.これにより,定期的にRunnable(あるいはそれを継承した)クラスのインスタンスのrun()が呼び出される.

Androidアプリ サブアクティビティ

投稿日:
タグ:

目次

ADTでプロジェクトを新たに作った時,デフォルトで1つのアクティビティが生成される.しかし,本格的なプログラムではいくつかのアクティビティを使用する.例えばスタート画面や設定画面,プレイ画面などがある.本稿では,複数のアクティビティを作り方のメモである.

アクティビティを追加するには次の3つのことを行わなければならない.

3つ目についてはなくても可能である.また,2つ目についてはファイルを分ける必要はない.しかし,本稿ではアクティビティ毎にファイルを分ける方針を取る.

アクティビティの追加

レイアウトファイルの生成

レイアウトの生成は次のような手順で行う.

  1. [File]を選択.
  2. [New]を選択.
  3. [Android XML File]を選択
  4. レイアウト名を指定.
  5. レイアウトの種類を指定.
  6. [Next >]を選択.
  7. [Finish]を選択.
本稿では,レイアウトの種類は"RelativeLayout"を選択する.また,レイアウト名にはactivity_sub.xmlと付ける.

レイアウトの編集については,ここでは言及しない.

新たなアクティビティの生成

クラスの追加は次のようにして行うことができる.

  1. [File]を選択.
  2. [New]を選択.
  3. [Class]を選択.
  4. クラス名を指定.
  5. スーパクラスをandroid.app.Activityに指定.
本稿ではクラス名にSubActivityという名前を使用する.

出来上がったソースコードには,次のようなコードを追加する必要がある.

public class SubActivity extends android.app.Activity {
        @Override
        protected void onCreate(android.os.Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_sub)
	}
}
setContentView()で指定するidには,新たに生成したレイアウトのものを使用する.

AndroidManifest.xmlへのアクティビティの登録

AndroidManifest.xmlへの登録もレイアウトと同様GUIで編集できる.手順は次の通りである.

  1. [Application]タブを選択.
  2. "Application Nodes"の[Add]を選択.
  3. "Activity"を選んで[OK]を選択.
  4. "Attributes for Activity"の"Name"を指定.
もちろんXMLファイルを直接書き換えても良い.なお,AndroidManifest.xmlの設定を忘れてもコンパイルは支障がなく行えるが,実行中にエラー終了する.


アクティビティの起動

アクティビティから別のアクティビティを実行するには,android.content.Intentを使用する.起動するアクティビティにデータを与えない場合,startActivity()を使用すれば良い.

android.content.Intent intent = new android.content.Intent(MainActivity.this, SubActivity.class);
startActivity(intent);

また,アクティビティの終了にはfinish()を使用する.

SubActivity.this.finish();
呼び出し先のアクティビティが終了すると,呼び出し元のアクティビティに制御が戻る.

データの受け渡し
呼び出し元アクティビティのデータ渡し

呼び出し先のアクティビティにデータを渡す時,startActivity()の代わりにstartActivityForResult()を使用する.そして,データを渡すにはputExtra()を使用する.putExtraは第1引数で指定した名前を鍵として,データを呼び出し先のアクティビティに渡す.また,第2引数はさまざまな型のものがある.

android.content.Intent intent = new android.content.Intent(MainActivity.this, SubActivity.class);
int i = 10;
intent.putExtra("integer", i);
startActivityForResult(intent, 0x01);

呼び出し先アクティビティのデータ受け取り

データを受け取るにはgetIntent()でandroid.content.Intentのデータを初期化する.そして,getExtra系の関数でデータを受け取ることができる.getExtra系の関数は"get + 型名 + Extra"の名前からなる.

android.content.Intent intent = getIntent();
int i = intent.getIntExtra("integer");
i *= 2;

呼び出し先アクティビティのデータ返却(渡し)

結果を呼び出し元返すには,setResult()で結果のタイプとandroid.app.Activityのインスタンスを指定する.

intent.putExtra("integer", i);
setResult(android.app.Activity.RESULT_OK, intent);
finish();

呼び出し元アクティビティのデータ受け取り

アクティビティを制御が戻った際に,onActivityResult()が呼び出される.onActivityResult()は,第1引数で呼び出し時にstartActivityForResult()で指定したアクティビティの識別コード,第2引数で結果のタイプ(呼び出し先アクティビティがsetResult()で指定した値),第3引数でandroid.content.Intentを受け取ることができる.

        @Override
        protected void onActivityResult(int request_code, int
	result_code, android.content.Intent sub)
        {
                int i;
                if (request_code==0x01 && result_code==MainActivity.this.RESULT_OK){
			i = sub.getIntExtra("integer");
                }
        }
第1引数と第2引数の値を判別した後は,呼び出し先アクティビティのデータ受け取り同様getExtra系の関数を使用する.

別のアプリの呼び出し

android.content.Intentはユーザが作成したアクティビティ以外にも別のアプリのアクティビティなどを起動できる.例えば別のアプリで画像を選択させたいような場合,次のようにアクティビティを起動する.

android.content.Intent intent = new android.content.Intent(android.content.Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 0x02);

このサンプルでは,intent初期化にandroid.content.Intent.ACTION_GET_CONTENTを与えているが,他にもいろいろなタイプがある.ただし,本稿ではこれ以上言及しない.

選択した画像のパスを取得する例を以下に示す.

        private String path;

	@Override
	protected void onActivityResult(int request_code, int result_code, android.content.Intent sub)
	{
		super.onActivityResult(request_code, result_code, sub);
		if (request_code==0x02 & result_code==android.app.Activity.RESULT_OK){
			android.content.ContentResolver cr = MainActivity.this.getContentResolver();
			android.database.Cursor c = cr.query(sub.getData(), new String[]{MediaStore.Images.Media.DATA}, null, null, null);
			if (c!=null){
				c.moveToFirst();
				path = c.getString(0);
				c.close();
			}

		}
	}
単純にパスを取得するにはgetData()とgetPathを使うだけで良い.
path = data.getData().getPath();
しかし,これによって取得できるのはURIと呼ばれるパスである.一部の関数はそれだと都合が悪いので,本稿ではそれをディレクトリ階層のパスに変更する例を紹介した.

Androidアプリ TextViewでさまざまな表現

投稿日:
タグ:

android.widget.TextViewはandroid.text.Html.fromHtmlを使うことで,表示する文字列にさまざまな視覚的修飾を施すことができる.android.text.Html.fromHtmlは次のような返り値を引数を持つ.

CharSequence android.text.Html.fromHtml(String)

本来HTMLのタグは視覚的な効果はない.しかしandroid.text.Html.fromHtmlは,いくつかのWEBブラウザのようにタグを視覚的に修飾するような機能を持つ.ただし,利用可能なタグや属性はいくつかに限定される.

タグ視覚効果
<br>改行
<p>段落
<div>
<b>太字
<em>
<i>イタリック体
<cite>
<dfn>
<strong>---------
<big>大文字
<small>小文字
<font>colorやfaceの属性を使用して色やフォントの種類を指定可能.
<blockquote>引用文
<tt>等幅フォント
<a>hrefでリンクにできる.
<u>下線
<sup>上付き文字
<sub>下付き文字
<h1>見出し
<h2>
<h3>
<h4>
<h5>
<h6>
<img>画像(ただしそのままでは使用できない)

以下に利用例を示す.

android.widget.TextView text = (android.widget.TextView)findViewById(R.id.text);
String text = "次の下線部は何と読むか?<br><u>画面</u>を見る.";
text.setText( android.text.Html.fromHtml(text) );

一覧