カスタムListViewで選択中の色が変わらないトラブル 
火曜日, 11月 23, 2010, 01:42 PM - Android
久しぶりに思いっきり嵌ったので整理してみた。

やりたいこと
行要素にカスタムViewを使ったListViewで、
チェック中の行は色を変えたい。
カスタムViewであることが味噌です。


これをクリックしてチェックすると色が変わるようにしたい。
カスタムViewだとこれが変わらずに難儀した、、。


色はselectorを使ったdrawableで指定したい。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 押されているときの色 -->
<item android:state_pressed="true" android:drawable="@color/green" />

<!-- チェックされた時の色 -->
<item android:state_checked="true" android:drawable="@color/blue" />

<!-- トラックボールなどで動かしたときに対象になったときの色(チェックの有無ではない) -->
<item android:state_selected="true" android:drawable="@color/white" />

<!-- 何につかうんだろう? -->
<item android:state_focused="true" android:drawable="@color/red" />

<!-- それ以外 -->
<item android:drawable="@color/black" />
</selector>


トラブルの現象
通常ではListViewの行要素にselector入りのdrawableを指定した
CheckedTextViewを指定するとチェック時に色が変わる。
しかし、カスタムViewを使うとチェック時でも色が変わらない。

原因
通常では行要素にCheckedTextViewを使うが、
こいつがCheckableインターフェースを実装していて、
そのインターフェース内の処理で描画を変えていることが判明。
しかし、自分の作ったカスタムViewは
そういう作りになっていなかったため色が変わらなかった。

対処
カスタムViewにCheckableインターフェースを実装し、
setCheckedなどのメソッド内で描画を切り替える処理を入れる。
カスタムViewのクラスであるCheckableLinearLayoutを作成した。
package net.cattaka.listviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.LinearLayout;

public class CheckableLinearLayout extends LinearLayout implements Checkable {
private boolean checked;
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };

public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CheckableLinearLayout(Context context) {
super(context);
}

@Override
public boolean isChecked() {
return checked;
}

@Override
public void setChecked(boolean checked) {
if (this.checked != checked) {
this.checked = checked;
refreshDrawableState();
}
}

@Override
public void toggle() {
this.checked = !this.checked;
refreshDrawableState();
}

@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
}


まとめ
Andriodの描画をselectorで切り替えるのは便利だけど、
ところどころ特定のViewの中の独自処理で切り替えられているのがあるので、
selectorでやればいいやと信用していると痛い目に遭う、、と。
勘弁してよ・・・(´・ω・)


今回のテストコードはこちら
ListViewTest.zip(Eclipseのプロジェクト)

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3.1 / 152 )

疑似AR:ウキウキWindow 
土曜日, 10月 30, 2010, 04:35 PM - ウキウキView
最近ARが流行ってると思う。
ARはAugmented Realityの略で日本語では拡張現実感というらしい。

なので、ちょっと使ってみたのだけど、
いまいちシックリ来なかった。
原因はGPSが高度を取れなかったり、座標ズレを起こすから
カメラ越しの現実と拡張された現実が旨く重ならないことが原因っぽい。

位置ズレや高さの問題はハードウェア的な精度の問題だから
今すぐに解決するのは難しいと思うので、
そういうのに関係なくよく見える「見せ方」を考えてみた。

これが僕のそれについての答えの1つ。

方位センサを使って現実の向き地図を同期させて疑似ARっぽくしてみた。
そしてそこにお店の情報を表示させてみた。

表示されているコンテンツはホットペッパー様のFOOMOOのものと
ブリリアントサービス様のウキウキViewのものです

とりあえず、まだまだ作り差しですが、
「ウキウキWindow」という名前でアンドロイドマーケットにアップしてます。

リンク
ウキウキView
FOOMOO

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 852 )

VMWareで開発環境を作って圧縮して配布する 
土曜日, 9月 4, 2010, 11:18 AM - プログラム
複数人で開発をすると開発環境を整えるのが大変なので
VMWareで開発環境を一式作って配布したらいいんじゃないかと模索した。

今回作ったのはAndroid用の開発環境でこんな構成です。
・Ubuntu 10.04 LTS
・Eclipse 3.5 Galileo + ADT
・Android SDK
一式インストールして、リポジトリの設定をして、
VMの仮想ディスクのサイズを見ると5.6GB、
DVDに入らないしでかすぎる・・・orz
仮想ディスクの使用量は4GBも無いから、もう少し小さくなって欲しい。

調べてみるとvmware-vdiskmanagerの-kオプションを使うとディスクを小さくできるらしい。
# vmware-vdiskmanager -k AndroidDev.vmdk

実行結果は・・・5.6GB、変わってねぇ・・・orz

よくよく考えてみるとOSのディスクの使い方の都合上、
ファイルは削除されても領域にはデータは残っている。
これらをクリア(0埋め)してあげないと仮想ディスクのサイズは小さくなれないようだ。

というわけでクリアした。
cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill

やってることはディスクを使い切るように
データが全て0な巨大なファイルを作成して削除するだけ。
改めてvmware-vdiskmanagerの-kオプションで実行すると4.4GBまで小さくなった。
これでDVD一枚に収まりそうだ。


でも流石にこのまま配布するのもなんなので、ZIPで圧縮することにした。
で、圧縮しようとしたらエラーになった。
$ zip -r AndroidDev.zip AndroidDev/AndroidDev.vmdk
zip warning: name not matched: AndroidDev/AndroidDev.vmdk

zip error: Nothing to do! (test.zip)

なんか「name not matched」とかでてるけど名前は間違ってないんだけど・・・、
とやってると、実はzipの2GBの容量制限に引っかかってたらしい。
エラーメッセージが間違ってんじゃん・・・(´・ω・)
なのでzipは辞めにして、7-Zipで圧縮したら無事圧縮できて1.3GBまで小さくなった。

あとはこれを仲間内で使うためにWebにアップしたいのだが、
こんな巨大なファイルを何処に置くかで悩む、と。
とりあえず低価格のオンラインストレージを模索中。

つかれた・・・(つ・ω・)つ

参考
How To Shrink VMware Virtual Disk Files (.vmdk)
  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 1013 )

GDD 2010 Dev QuizのしりとりをPrologで解いてみた 
金曜日, 8月 27, 2010, 08:59 PM - プログラム
GDD 2010 Dev QuizのしりとりをPrologで解いてみた。
ソースはこんな感じ。

/* 単語一覧 */
word('cjhexybf','c','f').
word('fwhsrnfmfwl','f','l').
word('fwmclnpgv','f','v').
word('fcqyykmcz','f','z').
word('fzizucydrln','f','n').
word('lzrolv','l','v').
word('lealqfhwvz','l','z').
word('vllumjtw','v','w').
word('veamp','v','p').
word('vombftpxjn','v','n').
word('vcqdfhx','v','x').
word('wjccgnhsp','w','p').
word('weetdzq','w','q').
word('wjfppjiq','w','q').
word('plguqhggea','p','a').
word('pqlmgfcbhcs','p','s').
word('pqdosvooi','p','i').
word('atlywms','a','s').
word('acolnpnk','a','k').
word('sqtfqle','s','e').
word('skmhxd','s','d').
word('skrpmkbu','s','u').
word('espslutsd','e','d').
word('epmzsxkey','e','y').
word('ejddiy','e','y').
word('eqtwaowso','e','o').
word('dxxhioj','d','j').
word('drzckcjo','d','o').
word('jtpvc','j','c').
word('zcznklih','z','h').
word('hhkzgq','h','q').
word('qtlwm','q','m').
word('mlkqlqek','m','k').
word('kuouldmt','k','t').
word('krzfwmdjxi','k','i').
word('tcwjjzfnhde','t','e').
word('ttihzemy','t','y').
word('yhrgnymb','y','b').
word('bpheoteg','b','g').
word('geyvr','g','r').
word('nrpex','n','x').
word('xzetvnrrwq','x','q').
word('idsnumnbno','i','o').
word('odijxqhihu','o','u').
word('uqslajc','u','c').
word('cfrdzsr','c','r').

/* 述語 */
member(X, [X|_]).
member(X, [_|L]) :- member(X, L).

nextWord([L|A], W) :-
word(L,_,T),word(W,T,_),not(member(W,[L|A])).

solvePath(PATH,PATH) :-
not(nextWord(PATH,_)).
solvePath(PATH,RESULT) :-
nextWord(PATH,W),
solvePath([W|PATH],RESULT).

goodMyPath(PATH,PATH) :-
not(nextWord(PATH,_)).
goodMyPath(PATH,RESULT) :-
not(badMyPath(PATH)),
nextWord(PATH,W1),
nextWord([W1|PATH],W2),
goodMyPath([W2|[W1|PATH]],RESULT).

badMyPath(PATH) :-
nextWord(PATH,W1),
not(nextWord([W1|PATH],_)).
badMyPath(PATH) :-
nextWord(PATH,W1),
not(nonBadEnemyPath([W1|PATH])).
nonBadEnemyPath(PATH) :-
nextWord(PATH,W),
goodMyPath([W|PATH], _).

solveGamePath(START,RESULT) :-
nextWord(START,W),
goodMyPath([W|START],RESULT).


実行すると全解探索して絶対勝てるパスを
バックトラックしながら全部だしてくれます。

?- solveGamePath(['cjhexybf'],RESULT).
RESULT = [cfrdzsr, jtpvc, dxxhioj, espslutsd, sqtfqle, atlywms, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [geyvr, bpheoteg, yhrgnymb, epmzsxkey, sqtfqle, atlywms, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [geyvr, bpheoteg, yhrgnymb, ejddiy, sqtfqle, atlywms, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, eqtwaowso, sqtfqle, atlywms, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, skrpmkbu, atlywms, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, krzfwmdjxi, acolnpnk, plguqhggea, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, pqdosvooi, wjccgnhsp, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, krzfwmdjxi, mlkqlqek, qtlwm, weetdzq, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, krzfwmdjxi, mlkqlqek, qtlwm, wjfppjiq, vllumjtw, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, krzfwmdjxi, mlkqlqek, qtlwm, xzetvnrrwq, vcqdfhx, lzrolv, fwhsrnfmfwl, cjhexybf] ;
RESULT = [cfrdzsr, uqslajc, odijxqhihu, idsnumnbno, krzfwmdjxi, mlkqlqek, qtlwm, hhkzgq, zcznklih, lealqfhwvz, fwhsrnfmfwl, cjhexybf] ;
false.


組み方は我ながら雑だけど、これでLv3まで全部いけました。
(Lv3は予め枝狩りをしておかないと無理でしたが。)
Prolog恐るべし…


  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 982 )

悩むことと考え込むこと 
日曜日, 8月 8, 2010, 06:52 PM - 戯れ言
悩むことと考え込むことは違う。
前者は放っておいても解決するが後者は解決しない。

進めなくなって立ち止まっているなら、
考えないといけないことか、
悩む必要のあることなのか、
そこの分別ができなければ拗らせることになる。

考えないことを悩んでも解決しない。
悩んでいるものを考えても解決しない。
そんなことを続けていれば、
心を磨り減らすだけだ。

まぁ悩むのを楽しんでいられることなら
いいんだけどね(´・ω・)

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 1060 )


Back Next