アクティビティに画像を配置

Posted by muchag | Android |
初回投稿:2011-04-17 (日) 0:02:09 | 最終更新:2011-04-17 (日) 22:50:01

SD カードにある画像を
アクティビティに配置しようとして苦労した・・・。

普段 ImageView に画像をセットする場合

res/drawable-hdpi/hoge.png
[android]ImageView imageView = new ImageView();
imageView.setImageResource(R.drawable.hoge);[/android] これでいける。

※ drawable-xxx というフォルダ名称は、
Android OS のヴァージョン(API Level)によってルールがある。
詳しくは、ディレクトリ構成

元々、画像の配置方法は以下の2種類らしい。

  1. リソースファイルを ID にて指定
  2. ビットマップを指定

上の例は1番目の手法なわけだが
これすら画像の保存場所によっては
他にも方法がある。
詳しくは、ディレクトリ構成
 

SD カードの画像を配置

ところが、SD カードの画像を配置しようとすると2番目の方法しかないようで
それには FileInputStream というクラスを利用する。
FileInputStream & FileOutputStream

色々試した結果、以下のスクリプトで成功した。
[android] // ImageView のインスタンスを生成
ImageView imgView = (ImageView) findViewById(R.id.imgView);

// File のインスタンスを生成
final File fileImage = new File(Environment.getExternalStorageDirectory().getPath(), “hoge.jpg”);

// FileInputStream のインスタンスを生成
FileInputStream fisImage = new FileInputStream(fileImage);

// Bitmap のインスタンスを生成
Bitmap bmpImage = BitmapFactory.decodeStream(fisImage);

// ImageView に画像を設定
imgView.setImageBitmap(bmpImage);[/android]

尚、5行目について
[android]// getPath メソッドがあってもなくてもOK
final File fileImage = new File(Environment.getExternalStorageDirectory().getPath(), “hoge.jpg”);
final File fileImage = new File(Environment.getExternalStorageDirectory(), “hoge.jpg”);

// sdcard/ フォルダに勝手なフォルダを配置し
// その中に画像ファイルを置いてもOK
// フォルダ名に大文字を用いてもOK
final File fileImage = new File(Environment.getExternalStorageDirectory().getPath(), “hoge.jpg”);
final File fileImage = new File(Environment.getExternalStorageDirectory().getPath(), “folderSample/hoge.jpg”);[/android]  
参考元サイト:yamaTum 画像の保存→表示 – TAKのAndroid開発日記

Posted by muchag | Android |
初回投稿:2011-04-17 (日) 0:02:09 | 最終更新:2011-04-17 (日) 22:50:01

FileInputStream & FileOutputStream

Posted by muchag | Java |
初回投稿:2011-04-16 (土) 23:17:13 | 最終更新:2011-04-16 (土) 23:19:08

外部ファイルを読み書きするのに利用するクラス。

  • FileInputStream ・・・ 読み込み
  • FileOutputStream ・・・ 書き出し

JDK 6 ドキュメント:FileInputStream & FileOutputStream

 
Android の場合だけかもしれないが
FileInputStream & FileOutputStream を利用する際は、
ファイルが存在しない場合の例外処理をつけなければならない・・
ようだ・・・なぜなら

処理されない例外の型 FileNotFoundException Java 問題

と怒られた。
[java2se6]try {
FileInputStream fisImage = new FileInputStream(fileImage);
} catch (FileNotFoundException e) {
}[/java2se6]  
Android Developers:FileInputStream & FileOutputStream
こちらにも try ステートメントを用いた例が載っている。
が、catch ステートメントはない・・・これいかに。

Posted by muchag | Java |
初回投稿:2011-04-16 (土) 23:17:13 | 最終更新:2011-04-16 (土) 23:19:08

Resources

Posted by muchag | Android |
初回投稿:2011-04-15 (金) 23:31:20 | 最終更新:2011-07-06 (水) 17:11:05

スクリプトを記述していると、リソースに指定したものを使いたくなるときがある。
Resources は、そんなときに利用できるクラス。

Android Developers:Context Resources

頻度の高い例として
[android]TextView textView = new TextView();
textView.setText(R.string.hoge);[/android] なんていうのがあるが、R.string.hoge というのは実は数値でしかないので
setText メソッドに直接使うと変換してくれるが
[android]TextView textView = new TextView();
textView.setText(R.string.hoge + R.string.hoi);[/android] なんてしてみると楽しいことが起きる。

文字列のつもりで連結させようとしても無理なのだ。
(私が実際にやってしまったのはバレバレ) 🙄

世の中そんなに甘いわけはなく
こういう場合に利用できるのが Resources クラス。
[android]Resources resources = getResources();
String myHoge = resources.getString(R.string.hoge);[/android] Android Developers:Context getResources

このようにすることで、実際の文字列を取得できるので
後はいつものように処理できる。

Resources クラスのメソッドは、もちろん getString だけではない。
型に合わせて色々あるので、上記ページを参考に。
 

getIdentifier

getIdentifier メソッドはリソース名を動的に設定したい場合に有効。

public int getIdentifier (String name, String defType, String defPackage)

Android Developers:Resources getIdentifier

第1引数:リソース名文字列
第2引数:リソースタイプ文字列
第3引数:パッケージ名文字列
 

静的取得

リソースを取得したい場合、私は以下のようにしている。
[android]Resources resources = getResources();
String myHoge = resources.getString(R.string.hoge);

または

String myHoge = getResources().getString(R.string.hoge);[/android]  
ところが、hoge の部分を入れ替えたいときがあり
手動(入れ替え分コードを記述するの)では困ることがある。

そんなときは、getIdentifier メソッドの出番。
 

動的取得

R.string.hoge
という記述は int 型のオブジェクト。

だから
R.string.hoge0
R.string.hoge1
R.string.hoge2

これらを
R.string.hoge + i
とか
R.string.”hoge” + i
のように記述したくなるがこれはできない。

そこで
[android]for (int i = 0; i < 3; i++) { // リソース ID を取得 int myInt = getResources().getIdentifier("hoge" + i, "string", getPackageName() ); // 取得したリソース ID を利用して文字列を取得 String myHoge = getResources().getString(myInt); // 取得した文字列をログへ書き出し Log.i("Test", myHoge ); }[/android] このようにしてやることで、動的にリソース名を設定できる。

Posted by muchag | Android |
初回投稿:2011-04-15 (金) 23:31:20 | 最終更新:2011-07-06 (水) 17:11:05

ListActivity

Posted by muchag | Android |
初回投稿:2011-04-15 (金) 17:51:19 | 最終更新:2011-07-07 (木) 19:52:20