カテゴリ: Android SDK
投稿者: terada
覚え書きです。
AppWidgetを作成中、「Unable to launch app ... process is bad」というようなエラーが出て、AppWidgetProviderもServiceも起動しなくなってしまいました。マニフェストXMLを編集したりいろいろやってみましたが、「アプリを一旦削除 → 端末を再起動」で解決しました。
カテゴリ: Android SDK
投稿者: terada
ViewのonMeasure内でwidthやheightの実際の値を取得する方法のコピペ用覚え書きです。MeasureSpec.getSizeを使います。
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
}
カテゴリ: Android SDK
投稿者: terada
ボタンのセレクターXML、いつもどうやって書くのか忘れてしまうので覚え書きです。いろいろ指定の仕方はあるみたいですが、ものによっては思ったような動作しなかったで、自分用ってことで。

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 通常 -->
<item
android:state_enabled="true"
android:state_window_focused="false"
android:drawable="@drawable/button_background_normal" />
<!-- 無効 -->
<item
android:state_enabled="false"
android:state_window_focused="false"
android:drawable="@drawable/button_background_disable" />
<!-- 押下 -->
<item
android:state_pressed="true"
android:drawable="@drawable/button_background_pressed" />
<!-- フォーカス -->
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/button_background_focused" />
<!-- 通常 -->
<item
android:state_enabled="true"
android:drawable="@drawable/button_background_normal" />
<!-- 無効、フォーカス -->
<item
android:state_focused="true"
android:drawable="@drawable/button_background_disable_focused" />
</selector>


「btn_selector.xml」とかの名前にしてdrawableフォルダに格納。
カテゴリ: Android SDK
投稿者: terada
startActivityForResultを使ってBluetoothAdapter.ACTION_REQUEST_DISCOVERABLEを呼び出す際のonActivityResult内での判定の仕方が特殊だったのでメモ。

private static final int REQUEST_DISCOVERABLE = 1;
private static final int DURATION = 300; // 持続期間

Intent discoverableIntent =
new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DURATION);
startActivityForResult(discoverableIntent,REQUEST_DISCOVERABLE);

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case REQUEST_DISCOVERABLE:
//成功時のresultCodeは「Activity.RESULT_OK」ではなく、持続期間の秒数になる。
//拒否された場合は0になる。

if (resultCode==DURATION)
{
// result ok ...
}
else
{
// result cancel ....
}
break;
default :
break;
}
}

2010/11/17: Cursorの走査

カテゴリ: Android SDK
投稿者: terada
初歩的で申し訳ありませんが、Cursorオブジェクトの中身を全部走査する方法。
他にも考えられるけど、実行速度的にはこの二つが速い様子。(paternAの方が若干速いかも??)

// paternA 
Cursor curA = getCursor();
int a = 0;
for(int i=0; i<curA.getCount();i++)
{
curA.moveToPosition(i);
a++;
}
if(curA!=null) curA.close();

// paternB
Cursor curB = getCursor();
int b = 0;
// curB.moveToNext(); // ←あってもなくても一緒みたい
while(curB.moveToNext())
{
b++;
}
if(curB!=null) curB.close();


以上。
カテゴリ: Android SDK
投稿者: terada
例えば、スタイルを定義するときなどにハードコーディングするよりもXMLをいじった方が、デザインとコードが分離できて良いのですが、ネット上ではどちらかというとハードコーディングしちゃうリソースの方が多くて、XMLで定義する際の情報が少ない印象です。なので、お恥ずかしながらXML要素に何が使えるのかなど毎回手探りでした・・・。どこかにまとまってるはずと思っていたのですが、ようやくリファレンス内の該当部分が見つかったので、メモ。

Resource Types

例えば、どこかで見つけたサンプルのgradientを単純な塗りつぶしにしたいときは、下記の部分を見れば、gradient要素を削除して、solid要素を追加してあげればいいなんてことがすぐに分かります。

Resource Types > Drawable Resources > Shape Drawable

これでもう安心。
カテゴリ: Android SDK
投稿者: terada
startActivityForResultを呼び出した直後にonActivityResultが実行され、呼び出されたActivityがfinishしたときには、onActivityResultが実行されない現象が起こりました。もうちょっと付け加えると、

(呼び出し元の)startActivityForResult

(呼び出し元の)onActivityResult

(呼び出される側の)onCreate

という順番になってます。

ググってみると、こんなディスカッションがありました。
Manifestファイルの中で、呼び出す側/呼び出される側の双方のActivityが「android:launchMode="singleInstance"」とか「android:launchMode="singleTask"」になっているとstartActivityForResultが機能しないようです。「singleInstanceは使うな」って書いてありますね。メモリー節約と思ってほぼ全部のActivityにこの設定をしていたのですが、あんまり使わない方が良いのだろうか・・・。

追記:ここらへんのまとめをされてる記事
カテゴリ: Android SDK
投稿者: terada
Canvasを色で塗りつぶして初期化するんでなくて、全くの透明な状態にしたいときは、これです。

Canvasを完全に初期化
canvas.drawColor(0,PorterDuff.Mode.CLEAR ); 


以上。
カテゴリ: Android SDK
投稿者: terada
terminal_icon

EclipseのLogCatだと、日本語が文字化けしてみれないので、そういうときはターミナル上でLogCatを吐き出します。
超簡単なんですが、普段ターミナル使うのが久しぶりだと「あれ、どうするんだっけ?」となってしまうので、ここに書いときます。

ターミナルにLogCatの出力を表示させるコマンド
adb logcat
カテゴリ: Android SDK
投稿者: terada
DialogにボタンなどのViewを追加したい場合のメモです。
まず、Dialogの中身をカスタマイズしたい場合の実装の仕方ですが、ApiDemos > app > dialog の中にLayoutInflaterを使ってViewをカスタマイズしている例があります。しかし、このサンプルコードにはリスナーの登録方法が示されていません。
で、いきなり結論ですが、下記のように実装すればリスナーを登録できます。下の例では、SeekBarのリスナーを定義してます。赤字で示したViewの参照取得の箇所が肝です。

public void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
// Dialogを表示
showDialog(MY_DIALOG);
}

@Override
protected Dialog onCreateDialog(int id)
{
switch (id)
{
case MY_DIALOG:
LayoutInflater factory = LayoutInflater.from(this);
final View editView = factory.inflate(R.layout.edit, null);
// Viewの参照を取得
SeekBar seekbar = (SeekBar) editView.findViewById(R.id.SeekBar); // ATTENTION : editViewからたどる
seekbar.setMax(100);
seekbar.setProgress(0);
// リスナー定義
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged( SeekBar _seekBar, int progress, boolean fromTouch) {
Log.v("onProgressChanged()", String.valueOf(progress) + ", " + String.valueOf(fromTouch));
}
public void onStartTrackingTouch(SeekBar _seekBar) {}
public void onStopTrackingTouch(SeekBar _seekBar) {}
});
Builder builder = new AlertDialog.Builder(MainActivity.this)
.setIcon(R.drawable.dialog_icon)
.setTitle(R.string.dialog_text_entry)
.setView(editView)
.setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton) {}
})
.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton) {}
});
Dialog editDialog = builder.create();
return editDialog;
default:
break;
}
return null;
}
Dialog editDialog = builder.create();
return editDialog;
default:
break;
}
return null;
}


※この実装方法はAndroid-SDK-Japanで教えていただきました。
→ Dialogをカスタマイズした際のリスナーの実装の仕方