2012-07-29 92 views
7

我在android中製作了一個小部件,它在點擊時產生一個隨機數。當小部件在主屏幕上單獨使用時,它可以很好地工作,但是當您添加多個小部件時,他們會同時開始生成隨機數。發生什麼事情是當單個小部件被點擊時它會更新所有這些小部件;導致許多隨機數字。我想要的是每個部件都與其他部件隔離;基本上,當點擊一個小部件時,它只會更新自身而不更新其周圍的其他人。我認爲這可以通過獲取當前窗口小部件的ID並僅更新該窗口部件來實現,與update方法更新所有窗口部件相同;我該怎麼做呢?只更新更新方法中的當前Android小部件ID

我的代碼

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, 
      MyWidgetProvider.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    for (int widgetId : allWidgetIds) { 
     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     Log.w("WidgetExample", String.valueOf(number)); 
     // Set the text 
     remoteViews.setTextViewText(R.id.update, String.valueOf(number)); 

     // Register an onClickListener 
     Intent intent = new Intent(context, MyWidgetProvider.class); 

     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

摘要:

此代碼是更新的方法,並在單擊窗口小部件時被調用。我希望此方法只更新調用它的小部件ID,而不是用於更新主屏幕上所有小部件ID的此方法。

回答

9

我有同樣的問題,我發現這種方式來解決這個問題:
1.To能夠在相同的AppWidgetProvider的多個實例加以區分,在註冊「的onClick」事件(意向)時,您必須添加一個額外的

Intent clickIntent = new Intent(context, DigiStation.class); 
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

2.更新只對當前實例的看法:

appWidgetManager.updateAppWidget(appWidgetId, views); 

3.Android重用意圖,所以當你創建一個意圖,確保你與小部件ID(appWidgetId)值把一個唯一的ID,否則之前使用的相同意圖將觸發所有實例:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); 

4.當處理click事件,從意圖的「額外」的有效載荷得到appWidgetId。
你可以找到更多有用的細節here

+0

感謝你解決了一個非常棘手的錯誤。關鍵的事情是將唯一的RequestCode放入getBroadcast()或getActivity()調用中,以獲得待定的意圖,並避免重複使用。使用appWidgetId似乎爲我工作得很好。 – 2013-10-13 17:06:20

+0

PendingIntent.getBroadcast()的最後一個參數是什麼意思?沒有值爲0的FLAG常量。 – cn123h 2016-01-19 07:28:03

+0

好吧,我嘗試了不同的FLAG,它們都不起作用。正如Andrew和hasanghaforian提到的那樣,第二個參數requestCode必須對每個小部件實例都是唯一的。 – cn123h 2016-01-20 20:57:14