goo blog サービス終了のお知らせ 

かずの随筆ブログ

あれこれエッセイを記述する場所としてブログを始めてみました。厳密に言うと随筆とエッセイは異なるそうですが。

assetManager.closeの罠(Android)

2013-05-01 08:44:06 | Android
assetManager.closeの罠(Android):自分用のメモ



/assetsに配置したファイルの処理をネットで見つけたHPの記述を参考にやってたらハマった


そのHPのサンプルソースは

AssetManager assetManager = getResources().getAssets();
InputStream inputStream = assetManager.open(path);

としてオープンしたファイルを

inputStream.close();
assetManager.close();

の様に閉じる感じで書いてあったのだが、それだとActivityが切り替わるタイミングで落ちる。
しばらく悩んでassetManager.close()を削除したら問題なく動作するようになった。


その後「AndroidゲームプログラミングA to Z」
をネットで立ち読みしたらサンプルコードにassetManager.close()は
記述されていなかったのでやはりinputStream.close()だけ行えば良さそうである。

AndroidのGIFアニメ表示でハマリ

2013-04-23 05:04:13 | Android
AndroidのGIFアニメ表示でハマリ(自分用メモ)



AndroidでGIFアニメを表示しようと思ってテストプログラムを組んでみたのだが表示されない…。
offest関連のバグがあることは知っていたのだがそれとは関係無さそう…。

もしやと思い、エミュレーターで実行してみると…表示される!! Σ( ̄ロ ̄lll)

調べてみるとどうやらAndroid4.1ではGIFアニメは表示されないらしい!

なんてこったい( ´Д⊂)
というかコレ自分がGalaxyNoteII使ってなかったら気が付かなかった気が…。
そういう意味では早めに気が付いてラッキーだったかも?


この件の情報はネット上でも非常に少なかったです。

AndroidでViewの切り替え時にButtonが表示されない問題

2013-04-21 03:33:12 | Android
AndroidでViewの切り替え時にButtonが表示されない問題(自分用のメモ)


Activityに複数のViewをAddしておき必要に応じてViewを切り替えて使用するケースに於いて
特定の端末で切り替えたViewのButtonが表示されないという問題が発生した。


初期化(onCreate)時に

//一つ目のView
firstView = this.getLayoutInflater().inflate(R.layout.first, null);
addContentView(firstView , new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

//二つ目のView
secondView = this.getLayoutInflater().inflate(R.layout.second, null);
addContentView(secondView , new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
resultView.setVisibility(View.INVISIBLE);

としておき、必要に応じて

firstView.setVisibility(View.INVISIBLE);
secondView.setVisibility(View.VISIBLE);

という感じに切り替えを行うことを想定。


すると特定の端末(恐らくOS依存)においてsecondViewに配置したButtonが表示されないケースが発生。
Buttonを複数配置した場合その内の一部だけ表示されるケースも発生した。


調査の結果上記で

setVisibility(View.INVISIBLE);

となっている部分を

setVisibility(View.GONE);

とすれば問題なく表示されることが判明。


以下推測だが、

addContentView()の直後でsetVisibility(View.INVISIBLE)したことでViewの構築が途中でストップしてしまい、
setVisibility(View.VISIBLE)した際に不完全なViewがそのまま表示されたのではないかと思う。

これを最初の処理をsetVisibility(View.GONE)に変えると、
setVisibility(View.VISIBLE)した際にViewの構築が最初から行われるので問題が発生しないのではないだろうか?


ちなみにView切り替え時に表示されないButtonを

button.setVisibility(View.GONE);
button.setVisibility(View.VISIBLE);

としても表示される様になるが、これはやや対症療法的な気がする。


AndroidのActivityの遷移コントロールについて

2013-04-13 08:50:00 | Android
AndroidのActivityの遷移コントロールについて(自分用のメモです)


通常Activityは下図の様に

┏━━━━━┓
┃Activity-1┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-2┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-3┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-4┃
┗━━━━━┛

とスタック、ポップの関係で遷移する。


ここで下図の様にActivity-1に戻りたくない場合

┏━━━━━┓
┃Activity-1┃
┗━━━━━┛
   ↓   
┏━━━━━┓
┃Activity-2┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-3┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-4┃
┗━━━━━┛

これは簡単でActivity-2を起動する時

Intent i = new Intent(getApplicationContext(),SecondActivity.class);
startActivity(i);
finish();

の様にすれば良い。(戻るボタンを無効にすると言う手もあるが)
Activity-2から戻ろうとしてもActivity-1は終了しているのでアプリ自体が終了する。


次に下図の様にActivity-4から直接Activity-2にActivityを飛ばして戻りたい場合

┏━━━━━┓
┃Activity-1┃
┗━━━━━┛
  ↓ ↑  
┏━━━━━┓
┃Activity-2┃←┐
┗━━━━━┛ │
  ↓ ↑   │
┏━━━━━┓ │
┃Activity-3┃ │
┗━━━━━┛ │
  ↓ (↑)   │
┏━━━━━┓ │
┃Activity-4┃─┘
┗━━━━━┛

手法は2つあって、まずActivity-2からActivity-3を呼び出す際に

Intent i = new Intent(getApplicationContext(),ThirdActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

とする方法、但しこれは決め撃ちになってしまう。
Activity-3はスタックに積まれないので戻りたいケースもある時には対応出来ない。
つまり(↑)の遷移が実現出来ない。

その様な場合はActivity-4から戻る際に

Intent i = new Intent(getApplicationContext(),SecondActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

とすれば良い。これだとActivity-4の実行状況に応じて戻るActivityを切り替えられる。
もちろんActivity-2だけではなくActivity-1にも(finish()してなければ)直接戻れる。


…ガーン!入力画面だと問題ないのにプレビューだと表示がズレる!!
使用フォントを指定出来るのかな?後で調べよう(--;



HTMLエディターならフォントが指定出来るけど当幅フォントが無いみたい(泣)

この件を調べてて等幅フォントの等幅は『とうはば』と読むのだと知った。
ず~~~~っと『とうふく』って読むのだと思ってた(滝汗)

不織布を『ふおりぬの』って読むんだと思い込んでた以来の衝撃でした(笑)

Eclipse立ち上げ時にフリーズ

2013-03-19 11:22:49 | Android
今日突然Eclipseが立ち上げ時にフリーズする様になってしまった。


具体的にはEclipseのウィンドウが表示される所まで進み応答なしになってしまう。
(マーケットプレースDND初期化中(だったかな)とかの表示あり)
ネット検索で得た情報をあれこれやってみるが一向に解決しない…。

これはもうEclipseの再インストールしかないかと思ったところで、
USBでGalaxyNoteIIが繋ぎっぱなしになっていたことに気が付きコードを抜いてみた…
→無事起動しました^^;;;

まさかこんな所に原因があったとは!
確かに繋いだままだと起動直後からログを吐きまくったりしてたけど
フリーズする程の問題が生じるとは思わなかった。


さすがにこれは忘れないと思うけど念の為にメモメモ_〆