カスタム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 )

Debian Linux(Lenny)とHT-03Aの接続トラブル 
日曜日, 7月 11, 2010, 03:49 PM - Android
Debian Linux(Lenny)でAndroid SDKを触っていて、
USB接続のHT-03Aをddmsから見ようとすると
例外が出て見れない現象が起こった。

37:32 E/DDMS: device (????????????) request rejected: insufficient permissions for device
java.io.IOException: device (????????????) request rejected: insufficient permissions for device
at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:726)
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:363)
at com.android.ddmlib.Device.executeShellCommand(Device.java:280)
at com.android.ddmuilib.SysinfoPanel.loadFromDevice(SysinfoPanel.java:156)
at com.android.ddmuilib.SysinfoPanel.deviceSelected(SysinfoPanel.java:123)
at com.android.ddmuilib.SelectionDependentPanel.deviceSelected(SelectionDependentPanel.java:52)
at com.android.ddms.UIThread.selectionChanged(UIThread.java:1662)
at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:753)
at com.android.ddmuilib.DevicePanel.notifyListeners(DevicePanel.java:741)
at com.android.ddmuilib.DevicePanel.access$1100(DevicePanel.java:56)
at com.android.ddmuilib.DevicePanel$1.widgetSelected(DevicePanel.java:360)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.android.ddms.UIThread.runUI(UIThread.java:484)
at com.android.ddms.Main.main(Main.java:105)


どうやらUSB接続を見るのに権限が足りていないようだ。
よくよく考えれば大抵のデバイスはrootでないと
接続できないので当然といえば当然だ。

で、調べてみると本家のサイトにも記載があった。
Setting up a Device for Development

このサイトの通り、/etc/udev/rules.d/51-android.rulesを作って、
# For Gusty/Hardy, edit the file to read:
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
# For Dapper, edit the file to read:
SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"

chmodしてudevを再起動して、
# chmod a+r /etc/udev/rules.d/51-android.rules
# /etc/init.d/udev reload

HT-03Aを差し直した。

・・・

でも相変わらず見えないままだった・・・。
様子からすると権限が正しく見えてない様子。
ふと思ってudevのrulesを"usb"でgrepをかけると・・・
/etc/udev/rules.d# grep -H "usb" *.rules

(略)
51-android.rules:SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"
51-android.rules:SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"
(略)
91-permissions.rules:SUBSYSTEM=="usb_device", MODE="0664"
(略)


91-permissions.rulesで上書きしてるがな・・・(´・ω・)
というわけで51-android.rules→92-android.rulesにリネームすることで対処した。

やっと実機でデバッグができる。
しかしディストリビューションごとのこの辺りの差異は厄介だなぁ。

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

Android x86 1.6-r2を試してみた 
日曜日, 6月 6, 2010, 09:15 PM - Android
Android x86 1.6-r2を試してみた。
プロジェクトのサイトよりandroid-x86-1.6-r2.isoをダウンロードして、
とりあえずCD-ROMを作成した。
そこからUSBのフラッシュメモリにインストールした。
いきなり問題が発生した。

画面に色化けが発生し、表示もぐちゃぐちゃになった。
試しているとThinkpad T42とCompaq n410cのみで、この現象が発生し、
GeForce5600GTSのマシンでは発生しなかった。

グラフィック周りがおかしいのかと疑ってみたがビンゴだった。
どうやらグラフィックボードによっては色数が16bitじゃないと
色化けが発生するらしい。
そして起動時にカーネルがVGAの設定をする際に利用可能な
最大な値の32bitモードで起動していたのが原因のようだ。
(推測の推測だけど・・・)
とりあえず/grub/menu.lstのkernelのオプションにVGAを入れることで解決した。
title Android-x86 1.6-r2
kernel /android-1.6-r2/kernel quiet root=/dev/ram0 androidboot
hardware=eeepc acpi_sleep=s3_bios,s3_mode vga=788
SRC=/android-1.6-r2 SDCARD=/dev/sdb3
initrd /android-1.6-r2/initrd.img

title Android-x86 1.6-r2 (Debug mode)
kernel /android-1.6-r2/kernel root=/dev/ram0 androidboot
hardware=eeepc acpi_sleep=s3_bios,s3_mode DEBUG=1 vga=788
SRC=/android-1.6-r2 SDCARD=/dev/sdb3
initrd /android-1.6-r2/initrd.img


これで万事解決かと思えばそうでもなく、電源周りや日本語入力など、
普通に使うには未だ難がありそうな感じだが、
タッチパネルが使えるネットブックだったらiPadのように使えそうだ。
余裕があればもう少し弄って見よう。

リンク
Android-x86 Project

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


Back