記事一覧

@Override

久しぶりなのに短くてアレですが・・

Java の @Overrideはちゃんとつけた方がいいですね・・・。

インターフェースのメソッド(任意)を実装したつもりが一向に呼ばれないのでなんでや・・・と思ってたらメソッド名の綴りが間違ってました; @Override付けたらちゃんとエラーになりました。

Email with Attatchment

I tried several methods to send an email with an attachment but all failed. Seemingly the image is attached but the content is empty.
I finally succeeded with the method of using ContentResolver.
I'll write about the detail maybe later...

画像を添付してメールを送る方法をいろいろ試していたのだけど、どれもうまくいかず。なんか中身が空になってしまう。
最終的に、ContentResolverを使った方法だとうまく行きました。
詳細は後で書きます。たぶん。。。

Adding an inflated XML layout as a subview

If you want to place your XML layout as the main contents of your activity just invoke setContentView( your_xml_resource_id ) and everything will be fine, but if you want it to be a subview of existing view the method is totally different:
((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate( your_xml_resource_id , your_parent_view);

If you google around about this agenda you'll find codes like this:
View v = activity.getViewInflate().inflate(R.layout.buttons, null, null);
But this never works in my environment. May be Android API has been changed?

XMLレイアウトを、アクティビティのメインコンテンツにしたい場合は、 setContentView( your_xml_resource_id ) でイッパツなんですが、これを既存のビューのサブビューにしたい場合はかなりやり方が違ってきます。

((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate( your_xml_resource_id , your_parent_view);

ところで、この件をググるとこんなコードが出てきますが、これはウチの環境では動きませんでした。
View v = activity.getViewInflate().inflate(R.layout.buttons, null, null);
これも2.xで変更された部分なのかな??

Workspace currupted!!

I had got an error while Eclipse was saving my workspace, and it had damaged the workspace file. As result everything seemed to have disappeared.
In my case the solution was pretty easy, just "import" my projects from the menu.
But one thing made me upset is: just when I have imported project no Perspective was opened and still nothing seen on the workspace. Selected Window > Open Perspective to open one and everything is back as before.

Eclipse が異常終了してしまった際にワークスペースが壊れてしまい、起動しても何も表示されなくなってしまいました。
今回のケースでは解決方法は簡単で、単にプロジェクトの import を行えばよい、というものだったんですが、一瞬青ざめたのが、インポートしたばかりのときは Perspective が開かれておらず、したがってプロジェクトは読み込んだもののワークスペースには何も現れない、という状態だった点。
Window > Open Perspective で Javaパースペクティブなりを開いたらちゃんと元通りになりました。

onKeyDown --> get KEYCODE_BACK no longer works

Android API changes very quickly.
Searching on the web about how to override the functionality of device's back button you'll find the code like this:


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ( keyCode == KeyEvent.KEYCODE_BACK ) {
// do something;
}
return true;
}

But this seems no longer work on Android 2.x
I followed a suggestion found on the web to have done like this instead.

@Override
public void onBackButton(){
// do something;
}

You'd better watch out when googl'ing because lots of obsolete information will come upwards in search results because they are not old enough to be hidden by new information.


Android APIの変化は早いですね。
さっき端末の戻るボタンを乗っ取る方法を調べてたんですが、多くのページが


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ( keyCode == KeyEvent.KEYCODE_BACK ) {
// do something;
}
return true;
}

という感じのコードを載せてる。でもこれって 2.x では動かないらしい。もうちょい調べて出てきたこういうコードで動きました。

@Override
public void onBackButton(){
// do something;
}

Web上では、1.x系の情報もまだ十分に「古くなりきってない」感じなので、けっこう検索の上位に出てきてしまいます。
この手の話をググるときは気をつけた方が良さそうですね。

Catching MotionEvent.ACTION_MOVE / UP

In my current Android app I have several customized views that inherit View Class.
Each of them overrides onTouchEvent and tracks touch movements.
But one of them cannot catch MotionEvent.ACTION_MOVE and UP, while others can.

I did about one hour of try & errors to find that, if you return false for onTouchEvent's return value when you caught MotionEvent.ACTION_DOWN, tracking of touch event finishes and is no longer performed until your next touch.
I modified my code to return true when needed and it worked.

It may mean "You returned false? OK, this touch is something you don't need to care about, right? You'll never get troubled even if I stop giving further information about it."
It's understandable but...

今手がけているAndroidアプリでは、Viewクラスをカスタマイズしたクラスをいくつか使っているのだけど、そのうちのひとつのクラスだけがタッチイベントの MotionEvent.ACTION_MOVE と UP を取れない、という現象に遭遇。
他はちゃんと取れてるのになんでや?と思って悩むこと1時間あまり、やっと発見したのが、最初に MotionEvent.ACTION_DOWN を受け取ったとき、onTouchEventの戻り値に false を返してしまうと、タッチの動作をそれ以上追いかけるのをやめてしまうようなのだ。
しかるべき時にちゃんと trueを返すようにしたらうまくいきました。

これってつまり「false返したってことはこのタッチは要らないんだよね?じゃあそれ以降情報渡すのやめるから!」ってことなんでしょうね。わからんでもないが・・・。

createBitmap and recycle()

I wrote a code like this to get a shrunk image, but when I try to use the bitmapB in the following part I get "bitmap already recycled" error.


Matrix matrix = new Matrix()
matrix.postScale(0.5, 0.5);
Bitmap bitmapA = BitmapFactory.decodeResource(getResources(),anId);
Bitmap bitmapB = Bitmap.createBitmap( bitmapA, 0, 0, bitmapA.getWidth(), bitmapB.getHeight(),matrix, true);
bitmapA.recycle();

I wondered why and searched a bit to found this:
http://stackoverflow.com/questions/4648926/create-a-subset-of-bitmap-without-make-a-copy

I thought createBitmap() makes copy of the original bitmap but if the bitmap is immutable they(source and destination) share the same byte array on the memory.

I think it's pretty confusing to have "create" in the name of the method...

画像を縮小しようと思ってこんなコードを書いたのだけど、得られた bitmapB をこの後使おうとすると「recycle済みのビットマップを使用した」という旨のエラーが出ます。


Matrix matrix = new Matrix()
matrix.postScale(0.5, 0.5);
Bitmap bitmapA = BitmapFactory.decodeResource(getResources(),anId);
Bitmap bitmapB = Bitmap.createBitmap( bitmapA, 0, 0, bitmapA.getWidth(), bitmapB.getHeight(),matrix, true);
bitmapA.recycle();

なんでや? と思って調べてみたらこれが出てきました。
http://stackoverflow.com/questions/4648926/create-a-subset-of-bitmap-without-make-a-copy

createBitmap()ってビットマップをコピーして新たにビットマップを作るものかと思ってたんですが、元のビットマップが immutable の場合、同じバイト列を共有するようです。なので bitmapB を破棄してしまうと bitmapA も実体がなくなってしまう、と。

それは理解したとして、それってcreateBitmapっていう名前のイメージと違う・・・。混乱のもとですわ。

Android - jpg color mode

It may depend on decoding attribute setting but in my case jpg files with CMYK color mode caused an error in runtime.

I came across this error while I was testing the method for getting resource ID dynamically, and I had no doubt that it's the problem about getting resource ID, so it took a few hours until notice that...

jpgファイルのカラーモードがCMYKだと実行時にエラーで落ちるようです。デコードの際のオプション設定をちゃんとすれば読めるのかもしれないけど、ひとまずそういうこともありましたよ、ということで。

で、この現象に出くわしたのがリソースIDを動的に取ってくるやり方を実験してた時で、なのでID取得が原因と思い込んでそれ(CMYKモードが読めてない)に気づくのに数時間要してしまったというお話し・・。

Shared Preferences

getSharedPreferences(prefName,mode)の省略形である getPreferences(mode) では、プリファレンス名としてアクティビティ名が採用されるんですね。
どこかの記事でアプリケーション名と書かれていた気がした(うろ覚え)ので勘違いしてました;
アプリケーション内で共通して使う場合は明示的にプリファレンス名を指定しましょう。

Subfolders ignored when making R.java

As my app have lots of images, so I wanted to categorize them and put into some subfolders, but the IDs disappeared from R.java when I did it.

Unfortunately, the android environment seems to be designed to ignore the subfolders under "drawable" etc..
http://stackoverflow.com/questions/1077357/can-the-android-drawable-directory-contain-subdirectories
Oh, my...

アプリ内に画像がいろいろ増えてきたんでカテゴリ分けしてサブフォルダに・・・と思ったら、サブフォルダに映すと R.java からIDが消えてしまう。

どうやらサブフォルダは無視される仕様らしい・・・
http://stackoverflow.com/questions/1077357/can-the-android-drawable-directory-contain-subdirectories
なんちゅう設計や・・・

ページ移動