2011/05/27: Unable to launch app ... が出たら端末を再起動
覚え書きです。
AppWidgetを作成中、「Unable to launch app ... process is bad」というようなエラーが出て、AppWidgetProviderもServiceも起動しなくなってしまいました。マニフェストXMLを編集したりいろいろやってみましたが、「アプリを一旦削除 → 端末を再起動」で解決しました。
AppWidgetを作成中、「Unable to launch app ... process is bad」というようなエラーが出て、AppWidgetProviderもServiceも起動しなくなってしまいました。マニフェストXMLを編集したりいろいろやってみましたが、「アプリを一旦削除 → 端末を再起動」で解決しました。
2011/05/11: 【コピペ用】onMeasure内で幅や高さの実際値を取得
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);
}
2011/04/26: 【コピペ用】ボタンのセレクターのXML
ボタンのセレクターXML、いつもどうやって書くのか忘れてしまうので覚え書きです。いろいろ指定の仕方はあるみたいですが、ものによっては思ったような動作しなかったで、自分用ってことで。
「btn_selector.xml」とかの名前にしてdrawableフォルダに格納。
<?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フォルダに格納。
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の走査
初歩的で申し訳ありませんが、Cursorオブジェクトの中身を全部走査する方法。
他にも考えられるけど、実行速度的にはこの二つが速い様子。(paternAの方が若干速いかも??)
以上。
他にも考えられるけど、実行速度的にはこの二つが速い様子。(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();
以上。
2010/11/10: XMLでdrawableのスタイル定義をする時とかに参照すべきページ
例えば、スタイルを定義するときなどにハードコーディングするよりもXMLをいじった方が、デザインとコードが分離できて良いのですが、ネット上ではどちらかというとハードコーディングしちゃうリソースの方が多くて、XMLで定義する際の情報が少ない印象です。なので、お恥ずかしながらXML要素に何が使えるのかなど毎回手探りでした・・・。どこかにまとまってるはずと思っていたのですが、ようやくリファレンス内の該当部分が見つかったので、メモ。
Resource Types
例えば、どこかで見つけたサンプルのgradientを単純な塗りつぶしにしたいときは、下記の部分を見れば、gradient要素を削除して、solid要素を追加してあげればいいなんてことがすぐに分かります。
Resource Types > Drawable Resources > Shape Drawable
これでもう安心。
Resource Types
例えば、どこかで見つけたサンプルのgradientを単純な塗りつぶしにしたいときは、下記の部分を見れば、gradient要素を削除して、solid要素を追加してあげればいいなんてことがすぐに分かります。
Resource Types > Drawable Resources > Shape Drawable
これでもう安心。
startActivityForResultを呼び出した直後にonActivityResultが実行され、呼び出されたActivityがfinishしたときには、onActivityResultが実行されない現象が起こりました。もうちょっと付け加えると、
(呼び出し元の)startActivityForResult
↓
(呼び出し元の)onActivityResult
↓
(呼び出される側の)onCreate
という順番になってます。
ググってみると、こんなディスカッションがありました。
Manifestファイルの中で、呼び出す側/呼び出される側の双方のActivityが「android:launchMode="singleInstance"」とか「android:launchMode="singleTask"」になっているとstartActivityForResultが機能しないようです。「singleInstanceは使うな」って書いてありますね。メモリー節約と思ってほぼ全部のActivityにこの設定をしていたのですが、あんまり使わない方が良いのだろうか・・・。
追記:ここらへんのまとめをされてる記事
(呼び出し元の)startActivityForResult
↓
(呼び出し元の)onActivityResult
↓
(呼び出される側の)onCreate
という順番になってます。
ググってみると、こんなディスカッションがありました。
Manifestファイルの中で、呼び出す側/呼び出される側の双方のActivityが「android:launchMode="singleInstance"」とか「android:launchMode="singleTask"」になっているとstartActivityForResultが機能しないようです。「singleInstanceは使うな」って書いてありますね。メモリー節約と思ってほぼ全部のActivityにこの設定をしていたのですが、あんまり使わない方が良いのだろうか・・・。
追記:ここらへんのまとめをされてる記事
2010/10/16: Canvasを透明にクリアしたい時
Canvasを色で塗りつぶして初期化するんでなくて、全くの透明な状態にしたいときは、これです。
Canvasを完全に初期化
以上。
Canvasを完全に初期化
canvas.drawColor(0,PorterDuff.Mode.CLEAR );
以上。
2010/10/04: LogCatをターミナルに出力(日本語可)
EclipseのLogCatだと、日本語が文字化けしてみれないので、そういうときはターミナル上でLogCatを吐き出します。
超簡単なんですが、普段ターミナル使うのが久しぶりだと「あれ、どうするんだっけ?」となってしまうので、ここに書いときます。
ターミナルにLogCatの出力を表示させるコマンド
adb logcat
2009/11/16: Dialogカスタマイズ時のリスナー登録方法
DialogにボタンなどのViewを追加したい場合のメモです。
まず、Dialogの中身をカスタマイズしたい場合の実装の仕方ですが、ApiDemos > app > dialog の中にLayoutInflaterを使ってViewをカスタマイズしている例があります。しかし、このサンプルコードにはリスナーの登録方法が示されていません。
で、いきなり結論ですが、下記のように実装すればリスナーを登録できます。下の例では、SeekBarのリスナーを定義してます。赤字で示したViewの参照取得の箇所が肝です。
※この実装方法はAndroid-SDK-Japanで教えていただきました。
→ Dialogをカスタマイズした際のリスナーの実装の仕方
まず、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をカスタマイズした際のリスナーの実装の仕方