2011年7月18日月曜日

ListView の画像に ContactBadge を表示する

ListView に表示している画像がクリックされたら ContactBadge を表示させる。OnItemClickListener ではクリックされた位置がわからないので、OnTouchListener で一度受けて座標情報を保存し、OnItemClickListener でレンジをチェックして処理を分ける。以下の例では画像の表示エリアが左側なので、その右端で判定している。

  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;
   }
   
  });

2011年7月1日金曜日

DialogPreference で summary を設定

DialogPreference を継承したクラスで summary を起動時にセットするときに、そのコンストラクタで getPersistedValue しても設定が読めない。ちょっと探してみた限りは明確な答えが見つからなかったけど、onAttachedToActivity() で設定を読むようにしたらちゃんと読めた。

 @Override
 protected void onAttachedToActivity() {
  AppInfo info = getSetting(); // この中で getPersistedString() してる
  if (info == null) {
   setSummary(mContext.getString(R.string.no_pref));
  } else {
   setSummary(info.mLabel);
  }
 }

その他ハマってしまったのは、onDialogClosed で superクラス呼ばないと設定が保存されないこと。