投稿

5月, 2010の投稿を表示しています

EditTextPreferenceを拡張する

EditTextPreferenceをそのまま使いたくないこともあるわけです。 例えば、Preferenceに永続化させるときは文字列を暗号化さたい、とか。 そんな時はEditTextPreferenceをextendsしてonPrepareDialogBuilder()をオーバーライドしちゃえばいいわけです。 こんな感じ。 ※値は"CCC"として保存するけど、EditTextに表示する際には"CCC converted"と表示して、保存するときは再び"CCC"で保存。 これに暗号化と復号化を組み合わせればいいわけですね。 @Override protected void onPrepareDialogBuilder(Builder builder) { super.onPrepareDialogBuilder(builder); // get value from xml file String value = getText(); Log.d(TAG, "value : " + value); // convert value value = value + " converted"; // display converted value this.getEditText().setText(value); // event handler when select ok button builder.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // re-convert value and save to xml setText("CCC

Viewを丸く切り取る

イメージ
Viewを丸く切り取るには、onDraw()をオーバーライドしてclipPath()してあげたクラスを作ってあげればOK。 こんな感じ。 public class ClipImageView extends ImageView { private static final String TAG = "ClipImageView"; public ClipImageView(Context context) { super(context); } public ClipImageView(Context context, AttributeSet attrs) { super(context, attrs); } public ClipImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private Path pathCircle = new Path(); /** * Viewのサイズ確保 */ protected void onSizeChanged(int w, int h, int oldw, int oldh){ // 丸いパス pathCircle.addCircle(w/2, h/2, 24, Path.Direction.CW); } /** * 描画処理 */ protected void onDraw(Canvas canvas) { // パスに沿って切り取り canvas.clipPath(pathCircle); super.onDraw(canvas); } } あとは、これをLayoutにぺたっと貼り付け。 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:layout_

Android2.1(X06HT/Desire)でハマったこと

SmartTraining 2.2.1にバージョンアップするにあたり、3点ハマりました。 いずれもAndroid2.1側の問題かと思います。 ムカついたのでメモメモ。 1.画面OFF時に加速度変化イベントが取れない。  あちこちで書いていますが、開発者の間では Issue3708 として認識されているAndroid側の不具合という認識の問題です。様々なアプリケーションもこれにより影響を受けており、Smart Alarm ClockやCardioTrainerなどの超有名どころアプリケーションもこの問題を解決できていません。この中の投稿でBrunoさんという方が、問題を回避する方法を提案しています。実際にX06HT(Desire)とNexus Oneで試してみましたが現象が改善されませんでした。やり方が悪いのか、何なのかわかりませんが、Brunoさんの方法を試しても改善されないという報告がいくつか見られたので、この方法は疑わしいと考えています。  Android側を弁護するとしたら、バックグラウンドでセンサーを不用意に扱うアプリケーションがバッテリーを大量消費してしまうことを回避する、という意味ではこの動作変更は成功しているかもしれません。しかし、バックグラウンドでの動作に制限をかけるのであれば、よりバッテリ喰いのGPSにはこういった制限がありません、これでは中途半端でしょう。明らかに旧バージョンからダウングレードしています。  回避方法としては、PowerManagerでSCREEN_DIM_WAKE_LOCK以上に設定します。SCREEN_DIM_WAKE_LOCKというのは、画面の液晶が暗くなっているが、OFFではない状態です。当たり前ですがバッテリかなり喰います。かつ、この状態でポケットに入れたりすると当然誤操作の元となります。SmartTraining的にはこの対応はありえないので、結局「残念なお知らせ」を表示してこの問題がAndroid側の問題であることをアピールするに留めました。 2.画面OFF時にTimerが動作しない(ことがある)。  上記問題と少し似ているのですが、画面OFF時にTimerが動作しません。「しないことがある」としているのには、いくつか条件が必要なためです。こちらで確認している条件としては、以下の条件でTimerが動作しません。 ・画