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 も必要

3 件のコメント:

  1. 始めまして。
    私も同じ症状で悩んでいたので、この記事は大変参考になります。

    つきましては一つ教えて頂きたい事があります。
    上記の中にあるmContextはどこかで変数を持つのでしょうか?

    お返事頂けると助かります。

    返信削除
  2. コメントありがとうございます。

    わかりにくくてすみません。添付のUpdateServiceクラスはAppWidgetProviderの派生クラスのサブクラスです。その派生クラスのメンバ変数でした。現在のコードではサービスクラスのthisを渡しています。

    返信削除
  3. お返事ありがとうございました。

    thisに気付くべきでした^^;
    本当にありがとうございます。

    返信削除