2011年5月21日土曜日

ウィジェットが動かなくなっちゃう問題

ウィジェットが気がつくと動かなくなってしまう問題は、端末の縦横が変わると発生することがわかった。

対処は、Orientation changeをキャッチして、PendingIntentを再設定して、RemoteViewを書き直す。書き直しはやらなくていいかも。
リンクの例では正しく動作しない。oldOrientation が newConfigと同じになる。
 public static class UpdateService extends Service {

  private List 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;
  }
  
 }
Manifestでandroid.permission.CHANGE_CONFIGURATION も必要

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。
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}