検索
最新コメント
タグクラウド
ファン
<< 2015年08月 >>
1
2 3 4 5 6 7 8
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
最新記事
カテゴリアーカイブ
android (10)
プロフィール
びーまさんの画像
びーま
50をこえて、androidアプリを作り始めた変わり者です。 オペレータ、PG、SE、PM、コンサルと全て経験はしています(笑)。 個人的に一人で設計して、一人で開発して、納得できるシステムを作ってみたかったので、始めました。 まあ、コスト無視の趣味だからできる訳なんで、妥協せずアプリを作っています。 なので、開発期間は・・・(汗)。

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2015年08月16日

RelativeLayoutのディテールにLisvViewを指定して、layout_heightにwrap_contentを指定した場合、getViewが指定したListの明細数より多く呼ばれる。

これは嵌りました。
最初は実害がないと思ったので放置していた事もあったのですが、レスポンスが悪いので改善しようとしたところ、原因がわからず、結局3日位かけたのではないかと思います。


では、現象と原因と対策を

【現象】
ListViewに表示した最初の明細のみ、CheckBox、RadioButton、Buttonが効かない。
正確に書くと、Viewの位置がずれているような感じ。
CheckBoxをタッチしても、リスナーが実行されず、隣のTextViewをタッチすると、CheckBoxとTextViewのリスナーが同時に実行されるみたいな動きだった。
この現象は、先頭のViewでしかおこらず、スクロールした場合、現象のおこった明細を再利用した明細が同じようになった。

【環境】
Android 最小8 ターゲット18
Adapterはカスタムしていた。
レイアウトはRelativeLayoutでディテールにListViewを指定している。
ディティールはLinearLayoutでorientationはvertical

【原因】
Activityから渡したArrayListの明細数以上にgetViewが呼ばれている。
こんな感じ。

getView:265]0 <- この数字がポジション。

08-16 09:09:26.132: I/LogUtil(3743): [SDListAdapter#getView:265]0
08-16 09:09:26.136: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]0
08-16 09:09:26.136: I/LogUtil(3743): [SDListAdapter#getView:265]1
08-16 09:09:26.136: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]1
08-16 09:09:26.140: I/LogUtil(3743): [SDListAdapter#getView:265]2
08-16 09:09:26.140: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]2
08-16 09:09:26.140: I/LogUtil(3743): [SDListAdapter#getView:265]3
08-16 09:09:26.140: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]3
08-16 09:09:26.140: I/LogUtil(3743): [SDListAdapter#getView:265]4
08-16 09:09:26.144: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]4
08-16 09:09:26.144: I/LogUtil(3743): [SDListAdapter#getView:265]5
08-16 09:09:26.144: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]5
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getView:265]0
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]0
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getView:265]1
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]1
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getView:265]2
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]2
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getView:265]3
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]3
08-16 09:09:26.148: I/LogUtil(3743): [SDListAdapter#getView:265]4
08-16 09:09:26.152: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]4
08-16 09:09:26.152: I/LogUtil(3743): [SDListAdapter#getView:265]5
08-16 09:09:26.152: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]5
08-16 09:09:26.152: I/LogUtil(3743): [SDListAdapter#getView:265]0
08-16 09:09:26.152: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]0
08-16 09:09:26.164: I/LogUtil(3743): [SDListAdapter#getView:265]1
08-16 09:09:26.168: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]1
08-16 09:09:26.168: I/LogUtil(3743): [SDListAdapter#getView:265]2
08-16 09:09:26.172: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]2
08-16 09:09:26.172: I/LogUtil(3743): [SDListAdapter#getView:265]3
08-16 09:09:26.172: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]3
08-16 09:09:26.176: I/LogUtil(3743): [SDListAdapter#getView:265]4
08-16 09:09:26.176: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]4
08-16 09:09:26.180: I/LogUtil(3743): [SDListAdapter#getView:265]5
08-16 09:09:26.180: I/LogUtil(3743): [SDListAdapter#getViewLocal:291]5

それだけなら、実害はないかと思ったんだけど、AdapterのgetViewでconvertViewがnullでない場合、Viewを使い回すが、最初の呼び出しにもかかわらず、同一ポジションが複数回呼ばれた場合、Viewを使い回すになり、その時の最初の明細のみ、この現象がおこっているとわかった。(なぜ現象が発生するかまではわからなかった)

なので、使い回しをせずに、毎回inflateするとその現象は起きない。

ただ、それだとレスポンスが悪化するので、複数回呼ばれる原因を確認したところ、AbsListViewで高さのサイズ計算が関係しているみたいだったので、ListViewのレイアウトを確認すると、layout_heightがwrap_contentだった。

この現象がRelativeLayoutのみで発生するのか、LinearLayoutでも発生

のか、までは確認していない。

【対策】

まず、layout_heightをmatch_parentに変えたところ、getViewが複数回呼ばれなくなった。

また、layout_height=“0dp”にして、layout_weight=“1”でも複数回呼ばれない事を確認した。



いや、これはほんとに時間かかりました。最初にボタンが効かなくなる現象を確認したのは今年の2月位で、この時は毎回inflateする事で逃げたのですが、結構多いデータを実機で試したところ、かなり遅かったので、本腰入れて調べ始めて、3日位かかったかと思います。Adapterだけではなく、ListViewもカスタムしていた為、どの機能で発生しているを見つけるまでが大変でした。

getViewが複数回呼び出されている現象がわかってからも、なぜ呼び出されるかの原因は見つける事ができず、幸い、メニューだけはなぜか複数回呼ばれていないので、その機能と発生する機能との違いを順番にソースを書き換えて動作確認し、レイアウトを変更すると発生する事がわかり、それで初めてListViewのlayout_heightが違う事に気づきました。

見た目は正常に動作していて、かつ同一ロジックの明細で一部だけにバグが出ると、見つけるのは、ほんとに時間かかります。

最後に、

また客先常駐の仕事が入り、今回は半年以上続きそうなので、ゆっくりアプリを作り続けます。
【このカテゴリーの最新記事】
posted by びーま at 10:06| Comment(0) | TrackBack(0) | android

2015年06月06日

API22

ちょっとした間違いでAPI22にあげたら、Rが作成されなくて回復に丸1日かかりました(泣)。

最終的にはこちらの方のプログを参考にして、回復出来たのですが・・。

http://slumbers99.blogspot.jp/2013/05/eclipse-adt-22-android-sdk-manager-2.html

最初はsupportV7をインストールするだけのつもりだったのですが、
SDKManagerのチェックボックスの外しを忘れたおかげで、部分的にAPI22にあがってしまい、その時点でRは消えています。
なので、API22を削除したのですが、それでも駄目。
で、いろいろ調べてバージョンあわせないと駄目っぽいみたいなんで、1時間かけてAPI22をフルセットアップしたんですけど、それでも駄目。

API22はEclipseにバグがあるみたいで、それはすぐ解消したのですが、Eclipse4.3のADTのバージョンをあわせようとして更新の確認を行ったのですが、なぜかダウンロード出来なかったのです(これはいまでも駄目です)。
仕方がないのとついでにEclipseのバージョンを4.4にあげたら、ようやくADTのバージョンをあわせる事ができたました。

でも、Rは再作成されず。

それで1日終わって、翌日にSDKManagerを確認してみると、上記のブログに書いてあったように、チェックが追加されていたので、それをダウンロードして、ようやくRが再作成されました。

前日にフルダウンロード後にSDKManagerを確認した時には、チェックがついていないのは確認したのですが、なぜに翌日になって、チェックがついているのか???。

まあ、解決したからよかったのですが、Eclipse4,4が悪いのか、API22のbuild_toolが悪いのか、ビルドが遅くなってますね。

1秒位止まる箇所が多々あって、自動ビルド中にカーソルとか動かしているとちょっとイライラします。

あと、AndroidStudioも入れてみたのですが、これはまだ移行するのは止めときます。
使い勝手覚えるだけでも、時間がもったいないので・・。

以上です。
posted by びーま at 12:00| Comment(0) | TrackBack(0) | android

2015年05月31日

eclipse stackoverflowerror

客先常駐のお仕事のおかげで、まったUPできていないのですが、アプリはいまだ開発中です(泣)。
いったいどれくらいかかる事やら・・。

で、本日有ったトラブルの備忘録を。

私は基本的なVIEWに対する動作はアプリ内で統一する為に、個々のVIEW単位にライブラリプロジェクトを作成して、それを参照しているのですが、この参照関係の指定を誤ると、eclipseがstackoverflowerrorしちゃうんですよね。(参照がループするような指定をすると出る)

以前出た時は、まだprojectのプロパティが効いていたので修正出来たのですが、今日出たやつはプロパティからプロジェクトが消えていて、なおかつ追加ボタンを押しても、なにも動作しなくなったんです。

さすがに焦って、いろいろ調べたのですが、ネット上で見つからないため、試しにproject.propertiesを見たところ・・・。

ありました。参照プロジェクトが(嬉)。

ここを修正したら、無事にstackoverflowerrorが解決しました。

以上です。
posted by びーま at 11:30| Comment(0) | TrackBack(0) | android

2015年04月10日

疑問 dialogFragmentの getSupportFragmentManager() 

1月から3月まで客先常駐の仕事が入ったので、中断してました。
4月から2週間だけ空きますが、5月いっぱい、また客先常駐のお仕事・・。

今回は疑問ですね。

dialogFragmentにはgetFragmentManager()が準備されているのに、
getSupportFragmentManager()はないんですよね。
getFragmentManager()だとnullで帰ってくるし・・。
FragmentActivityのgetFragmentManager()とは別物なんでしょうかね?
(もちろんandroid-support-v4.jarは入れている状態です)
なんででしょうか・・。

2015年01月17日

JAVA メソッドのパラメータ

<追記です>
私の勘違いでした。ごめんなさい。



JAVAの基本的な事を知らなかったためにちょっと嵌りました(汗)。

メソッドに受け渡しにオブジェクトを渡すと、メソッド内でオブジェクトを編集した場合、呼び出し元も参照できるので、戻り値を1つしか設定できないJAVAの仕様にも関係して助かっていたのですが、
オブジェクトを配列で渡すと、駄目なんですね・・・。
配列はオブジェクトでないと知りました・・・。

配列自体をオブジェクトで渡して、メソッド側でキャストする方法もあると思うのですが、
メソッドはいろいろなオブジェクトでオーバーロードしていたので、書き直すのがめんどいので、確認してません。

以上です。

<訂正です>

上記記載は私の勘違いかもしれません。
配列を戻すように修正しても、やっぱり駄目だったので、これの為ではなかったかもしれません。
原因わかったら、アップします。


posted by びーま at 09:30| Comment(0) | TrackBack(0) | android

2015年01月10日

備忘録 EditTextのonClickとonFoucasChangeの関係

EditTextでonClickとonFoucasChangeのリスナーを同時に指定すると、
FoucasChangeを伴なわないClickがonClickだけ、
appからのrequestFoucasがonFoucasChangeだけ、動くのは良いとして、
FoucasChangeを伴うClickがonFoucasChangeだけしか動かないのはびびりました(笑)。
ちなみにEditTextはkeyListenerをnull にして入力不可にしていますから、その関係でしょうかね?
まあ、自分的にはこの仕様には助かっていますが・・。

posted by びーま at 12:40| Comment(0) | TrackBack(0) | android

2014年12月16日

備忘録 genymotionとEnvironment.getExternalStorageDirectory().getPath()の関係

開発はgenymotionを使っているんだけど、CSVファイルをSDCARDに出力しようと思ったら、ファイルが見つからなくて、ちょっと嵌ったのでメモ。

genymotionでEnvironment.getExternalStorageDirectory().getPath()を行うと、/storage/emulated/0で帰ってくるけど、eclipseのddmeで見ると、そのフォルダにはなくて、なぜか、/mnt/shell/emulated/0の配下にある。
多分、エイリアスの関係だろうといい加減に納得し、調査はしてません。

以下を参考にさせていただきました。
http://stackoverflow.com/questions/18530114/accessing-files-from-genymotion-sd-card




posted by びーま at 21:16| Comment(0) | TrackBack(0) | android

2014年12月07日

styleでlayout_marginを指定すると・・

styleでlayout_marginを指定すると、xmlでlayout_marginを指定し直しても、styleの方が優先されているように見えるだけど・・。

その他のコマンドはxmlで指定し直された方が反映されているのに、layout_marginだけなぜに?

自分の指定の仕方が悪いのかな・・。

原因追及はしません。
posted by びーま at 16:25| Comment(0) | TrackBack(0) | android

2014年11月27日

訳のわからない現象

本日、訳のわからない(自分だけかもしれない)現象が発生。

いままで動いていたGridViewのドラッグ&ドロップでの並び替えロジックだったのに、
Layoutをちょっと変更したら、なぜかlongclickが効かなくなった。
なにを変更したかと言うと、gridviewのインナーレイアウトで
linearLayoutが2重になっていて、不要のワーニングが出ていたので、1つにまとめただけなんだけど、
そうしたら、なぜかlongclickが効かなくなった訳です。
この変更以外にも、他の影響しないロジック部分をかなり変更していたので、
それが原因とわかるまで、また時間がかかってしまった。

この現象、いつでも再現できますが、原因追及は止めときます。
タグ: drop gridview
posted by びーま at 19:02| Comment(0) | TrackBack(0) | android

2014年11月18日

備忘録 setContentViewその2

原因らしきものが推測できた。
【現象】
findviewで正しく取得されているにも関わらず、そのviewに対してのアクションがされない
(onClick setTextが反映されない)

【対策】
setContentViewを2カ所実行していた箇所があったので、片方を削除

【原因】
setContentViewで同一レイアウトを指定していたので、同じレイアウトが上書きされている状態
そこにfindviewすると、同一IDのため、最初のレイアウトと紐付けしていたと思われる。
しかし、画面に表示されているのは、後のレイアウトのため、なにもアクションが効かなかったように見えた(と推測される)

【感想】
原因わかるまで2時間かかった・・・
posted by びーま at 13:10| Comment(0) | TrackBack(0) | android
Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: