2012-05-14 11 views
10

私はウィジェットで作業していましたが、いくつかの進歩を遂げていましたが、それでも私が望むことはできません。Androidウィジェットが更新されていない - 間違ったウィジェットIDを持っています

私はokで動作するコンフィギュレータアクティビティを持っています。それが閉じると、私はWordWidgetクラスのupdateAppWidgetメソッドを呼び出し、ウィジェットは乱数を更新します。

私はそれをすることはできませんonClickのために変更する乱数を取得します。ログによると、私はonReceive()メソッドを入力しますが、それについてはそれです。

ログにはウィジェットIDが印刷されています。私はconfiguratorアクティビティから実行するとappWidgetId = 33を表示していますが、ウィジェットを押すとappWidgetId = 24が表示されることに気付きました。

これはコードである:

public class WordWidget extends AppWidgetProvider 
{ 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    { 
     //This is run when a new widget is added or when the update period expires. 
     Log.v("wotd", "In onUpdate(), updating " + appWidgetIds.length + " widgets"); 
     Log.v("wotd", " the array is " + appWidgetIds.toString()); 

     for(int x = 0; x < appWidgetIds.length; x++) 
     { 
      Integer appWidgetId = appWidgetIds[x]; 


      //Method that updates the random value 
      updateAppWidget(context, appWidgetManager, appWidgetId); 
     } 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     super.onReceive(context, intent); 
     Log.v("wotd", "In onReceive() with intent=" + intent.toString()); 
     if (intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE")) 
     { 
      Integer mAppWidgetId; 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

      Bundle extras = intent.getExtras(); 
      if(extras != null) 
      { 
       Log.v("wotd", "In onReceive(), extras is valid"); 
       mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

       //If they gave us an intent without a valid widget Id, just bail. 
       if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
       { 
        Log.v("wotd", "In onReceive(), mAppWidgetId is ok"); 
        updateAppWidget(context, appWidgetManager, mAppWidgetId); 
       } 
      } else 
      { 
       Log.v("wotd", "In onReceive(), extras is INVALID"); 
       mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
      } 
     } 


    } 


    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, Integer appWidgetId) 
    { 
     Log.v("wotd", "In updateAppWidget() with appWidgetId=" + appWidgetId); 

     //Setup onClick 
     Intent widgetIntent = new Intent(context, WordWidget.class); 
     widgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
     widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0); 

     Integer nextNumb = new Random().nextInt(100); 
     Log.v("wotd", "In updateAppWidget(), nextNumb = " + nextNumb.toString()); 

     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); 
     remoteView.setTextViewText(R.id.mainText, String.valueOf(nextNumb)); 
     remoteView.setOnClickPendingIntent(R.id.mainText, widgetPendingIntent); 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 
} 

これは、ログ・ファイルで、私は、ウィジェットが(環境設定の活性はまた、ログプリントアウトを有し、このことは、異なる数としてウィジェットIDを示すことに注意タッチしてから):

05-14 17:15:47.453: V/wotd(1585): In onReceive() with intent=Intent { act=android.appwidget.action.APPWIDGET_UPDATE flg=0x10000000 cmp=com.rfxlabs.wordofthedaywidget/.WordWidget bnds=[202,177][222,201] (has extras) } 
05-14 17:15:47.453: V/wotd(1585): In onReceive(), extras is valid 
05-14 17:15:47.463: V/wotd(1585): In onReceive(), mAppWidgetId is ok 
05-14 17:15:47.463: V/wotd(1585): In updateAppWidget() with appWidgetId=24 

5月14日17:15:47.463:V/wotd(1585):あなたが見ることができるようupdateAppWidgetで()、= 42

nextNumbだから、私は実際に私のupdateAppWidgetに入っています方法、しかし何らかの理由でappWidgetIdが間違っています。

これは何が起こっているのですか?どうもありがとう!あなたの関数で

+0

あなたがウィジェットcickまたは別の何かにウィジェット更新したい問題が何でありますか? –

+0

はい、ウィジェットに触れるたびに乱数を変更します。 – Sandy

+0

少し違いがある同じコードの2つのコピーはありませんか? – Ronnie

答えて

20

updateAppWidgetは、この行に移動:カスタム放送を登録する必要がありTouchであなたのホーム画面のウィジェットを更新するための

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, appWidgetId, widgetIntent, 0); 
+0

javadocは、2番目のパラメータ(要求コード)が使用されていないことを明示的に示しています。 –

+0

それは動作します!理由を知らない。誰もこの魔法の仕組みについて説明できますか? – deviant

+3

魔法はありません.PendingIntentsは設計によってユニークである必要があります。リクエストコードとして使用されるウィジェットIDは、あるインスタンスを別のインスタンスと区別するのに役立ちます –

0

PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0); 

...とにそれを変更しますウィジェットのアクションとして追加してください:

ステップ1:登録カスタム受信者:

<intent-filter> 
<action android:name="com.imrankhanandroid.HomeWidgetRandomNum.ACTION_WIDGET_RANDOM"/> 
</intent-filter> 

ステップ2:あなたのウィジェットクラスAddActionではのようにレイアウトします

public void onReceive(Context paramContext, Intent paramIntent) 
    { 
     //Intent 
     String str = paramIntent.getAction(); 
     if (paramIntent.getAction().equals(ACTION_WIDGET_RANDOM)) { 
      updateWidgetState(paramContext, str); 
     } 
     else 
      { 
       super.onReceive(paramContext, paramIntent); 
      } 
    } 

STEP 3:

rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layoutmain); 
Intent active = new Intent(paramContext, Randomnuberwidget.class); 
active.setAction(ACTION_WIDGET_RANDOM); 
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(paramContext, 0, active, 0); 
rview.setOnClickPendingIntent(R.id.ImageView_gps, actionPendingIntent); 

:あなたのupdateWidgetStateではとして意図に新しいアクションを追加します最後にWorking HomeWidgetの例をここからダウンロードできます HomeWidgetRendomNumberどのGenクリックごとに乱数を消去します。

0

あなたはgetBroadcastで最後のフラグを設定する必要があります。PendingIntent.FLAG_UPDATE_CURRENT

関連する問題