mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { ImageView iv = (ImageView) arg1.findViewById(R.id.photo); int right = iv.getRight(); if (mListPosX <= right) { Contact contact = mAdapter.getItem(position).getContact(); Uri uri = ContactsContract.Contacts.getLookupUri(contact.getContactId(), contact.getLookupKey()); ContactsContract.QuickContact.showQuickContact(mContext, iv , uri, ContactsContract.QuickContact.MODE_SMALL, null); mContactBadge = true; } else { Intent intent = new Intent(MainActivity.this, ContactActivity.class); intent.putExtra(ContactActivity.INTENT_CONTACT, mAdapter .getItem(position).getContact().getContactId()); startActivity(intent); } } }); mListView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mListPosX = (int) event.getX(); return false; } });
Androidアプリ開発メモ
2011年7月18日月曜日
ListView の画像に ContactBadge を表示する
ListView に表示している画像がクリックされたら ContactBadge を表示させる。OnItemClickListener ではクリックされた位置がわからないので、OnTouchListener で一度受けて座標情報を保存し、OnItemClickListener でレンジをチェックして処理を分ける。以下の例では画像の表示エリアが左側なので、その右端で判定している。
2011年7月1日金曜日
DialogPreference で summary を設定
DialogPreference を継承したクラスで summary を起動時にセットするときに、そのコンストラクタで getPersistedValue しても設定が読めない。ちょっと探してみた限りは明確な答えが見つからなかったけど、onAttachedToActivity() で設定を読むようにしたらちゃんと読めた。
その他ハマってしまったのは、onDialogClosed で superクラス呼ばないと設定が保存されないこと。
@Override protected void onAttachedToActivity() { AppInfo info = getSetting(); // この中で getPersistedString() してる if (info == null) { setSummary(mContext.getString(R.string.no_pref)); } else { setSummary(info.mLabel); } }
その他ハマってしまったのは、onDialogClosed で superクラス呼ばないと設定が保存されないこと。
2011年6月15日水曜日
アプリから画像の選択Intentをもらう
画像をピックするIntent呼び出しに反応するには、AndroidManifest.xml に以下を追加する。
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.OPENABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
ただし、アプリによってはこれで受け取れない。例えば Seesmic の「添付ファイルを選択」に反応するためには、以下を追加する必要がある。
<intent-filter>
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.OPENABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.OPENABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
ただし、アプリによってはこれで受け取れない。例えば Seesmic の「添付ファイルを選択」に反応するためには、以下を追加する必要がある。
<intent-filter>
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.OPENABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
2011年6月5日日曜日
Xperia で GregorianCalendar に年月日をセット
Xperiaでカレンダーに値をセットしてゲットすると値がずれることがある。例えば 1995/6/5 を new GregorianCalendar(1995, 6 - 1, 5) として、Calendar.DATE をgetすると 4 が返ってくる。ちょっと調べてみたら、1976/5/3 から 2000/9/17 の期間はずれる。1942年あたりもずれる。同じコードをエミュレータで実行してみるとずれない。DATEをセットする前にゲットするとずれない。
GregorianCalendar calendar = new GregorianCalendar(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month - 1); // Xperiaで日にちがずれる。 calendar.get(Calendar.DATE); calendar.set(Calendar.DATE, day);
2011年5月21日土曜日
ウィジェットが動かなくなっちゃう問題
ウィジェットが気がつくと動かなくなってしまう問題は、端末の縦横が変わると発生することがわかった。
対処は、Orientation changeをキャッチして、PendingIntentを再設定して、RemoteViewを書き直す。書き直しはやらなくていいかも。
リンクの例では正しく動作しない。oldOrientation が newConfigと同じになる。
対処は、Orientation changeをキャッチして、PendingIntentを再設定して、RemoteViewを書き直す。書き直しはやらなくていいかも。
リンクの例では正しく動作しない。oldOrientation が newConfigと同じになる。
public static class UpdateService extends Service { private ListManifestでandroid.permission.CHANGE_CONFIGURATION も必要mIdList; private int mOrientation; @Override public void onStart(Intent intent, int startId) { Bundle extras = intent.getExtras(); int id = AppWidgetManager.INVALID_APPWIDGET_ID; if (extras != null) { id = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } if (id == AppWidgetManager.INVALID_APPWIDGET_ID) { return; } if (mIdList == null) { mIdList = new ArrayList (); } mIdList.add(id); AppWidgetManager manager = AppWidgetManager.getInstance(this); updateWidget(mContext, manager, id); } @Override public void onConfigurationChanged(Configuration newConfig) { if(newConfig.orientation != mOrientation) { mOrientation = newConfig.orientation; AppWidgetManager manager = AppWidgetManager.getInstance(this); for (int id : mIdList) { updateWidget(mContext, manager, id); } } } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } }
2011年5月8日日曜日
ExpandableListViewの長押し
ExpandableListViewでは、アイテムの長押しを setOnLongClickListenerで設定できない。
コンテクストメニューを使って実現する。
こんな感じで設定しておく。
メニューが選ばれたらそれを実行。
コンテクストメニューを使って実現する。
こんな感じで設定しておく。
mExpandableListView .setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; int type = ExpandableListView .getPackedPositionType(info.packedPosition); int groupPosition = ExpandableListView .getPackedPositionGroup(info.packedPosition); int childPosition = ExpandableListView .getPackedPositionChild(info.packedPosition); // Only create a context menu for child items if (type == 1) { // Array created earlier when we built the // expandable list Contact contact = (Contact) mAdapter.getChild( groupPosition, childPosition); menu.setHeaderTitle(contact.getName()); menu.add(0, MENU_EDIT, 0, "Edit birthday"); menu.add(0, MENU_DELETE, 1, "Delete birthday"); } } });
メニューが選ばれたらそれを実行。
public boolean onContextItemSelected(MenuItem menuItem) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem .getMenuInfo(); int groupPos = 0, childPos = 0; int type = ExpandableListView .getPackedPositionType(info.packedPosition); if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { groupPos = ExpandableListView .getPackedPositionGroup(info.packedPosition); childPos = ExpandableListView .getPackedPositionChild(info.packedPosition); } Contact contact = (Contact) mAdapter.getChild(groupPos, childPos); switch (menuItem.getItemId()) { case MENU_EDIT: dateDialog(contact, contact.getBirthday()); return true; case MENU_DELETE: deleteBirthday(contact); default: return super.onContextItemSelected(menuItem); } }
2011年5月5日木曜日
コード表示
http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html
を参考にして、コード表示できるようにした。ここで紹介されている導入方法はFirefoxでは動作しない。IEタブで開くと導入することができた。
最初よくわからなくて、いろいろやってたらコード表示を1個しか書いていないにもかかわらず2個表示されるようになった。1個だけ表示するように戻す方法がわからなかったので、そのブログを廃棄!して別のブログを作成したw。
を参考にして、コード表示できるようにした。ここで紹介されている導入方法はFirefoxでは動作しない。IEタブで開くと導入することができた。
最初よくわからなくて、いろいろやってたらコード表示を1個しか書いていないにもかかわらず2個表示されるようになった。1個だけ表示するように戻す方法がわからなかったので、そのブログを廃棄!して別のブログを作成したw。
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
登録:
投稿 (Atom)