2011-08-17 81 views
0

如果我有两个小部件,并按下第一个小部件上的按钮,则第二个小部件会自动更新。那是不是打算:)在调试时我注意到,第一小德用第二的为widgetid更新第一个小部件更新第二个小部件

public class WidgetActivity extends AppWidgetProvider { 
    public static WidgetActivity Widget = null; 
    public static Context context; 
    public static AppWidgetManager appWidgetManager; 
    public static int appWidgetIds[]; 
    public static String ACTION_OPEN_APP = "OpenApp"; 
    private static int appWidgetId; 


    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
     if (null == context) context = WidgetActivity.context; 
     if (null == appWidgetManager) appWidgetManager = WidgetActivity.appWidgetManager; 
     if (null == appWidgetIds) appWidgetIds = WidgetActivity.appWidgetIds; 

     WidgetActivity.Widget = this; 
     WidgetActivity.context = context; 
     WidgetActivity.appWidgetManager = appWidgetManager; 
     WidgetActivity.appWidgetIds = appWidgetIds; 

     final int N = appWidgetIds.length; 
     for (int i=0; i<N; i++) 
     { 
      appWidgetId = appWidgetIds[i]; 

      updateAppWidget(context,appWidgetManager, appWidgetId);    
     } 

    } 


    public void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
      int appWidgetId) { 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

     Intent intent = new Intent(context, UpdateService.class); 


     PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

     Intent configIntent = new Intent(context, Main.class); 
     configIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0); 

     remoteViews.setOnClickPendingIntent(R.id.headlinesBox, configPendingIntent); 

     remoteViews.setOnClickPendingIntent(R.id.WidgetRefresh_btn, pendingIntent); 

     setHeadlines(appWidgetId); 

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

    public static void setHeadlines(int appWidgetId) 
    { 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

     ArrayList<String> newsItems = getRssItems("*****rss.php", appWidgetId); 

     if(newsItems.size() == 3) 
     { 
      remoteViews.setTextViewText(R.id.headline1, newsItems.get(0)); 
      remoteViews.setTextViewText(R.id.headline2, newsItems.get(1)); 
      remoteViews.setTextViewText(R.id.headline3, newsItems.get(2)); 
     } 

     DateTime dateTime = new DateTime(); 
     CharSequence text = dateTime.getTime(); 
     remoteViews.setTextViewText(R.id.WidgetUpdateTime, text); 
     remoteViews.setViewVisibility(R.id.progressWidget, View.GONE); 
     remoteViews.setViewVisibility(R.id.WidgetRefresh_btn, View.VISIBLE); 

     appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
    } 



    public static ArrayList<String> getRssItems(String feedUrl, int appWidgetId) 
    { 

    } 


    public static class UpdateService extends Service { 
     @Override 
     public void onStart(Intent intent, int startId) { 

      RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget); 

      remoteViews.setViewVisibility(R.id.WidgetRefresh_btn, View.GONE); 
      remoteViews.setViewVisibility(R.id.progressWidget, View.VISIBLE); 


      appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 


     WidgetActivity.Widget.onUpdate(context, appWidgetManager, appWidgetIds); 

     } 

     @Override 
     public IBinder onBind(Intent arg0) { 
      return null; 
     } 
    } 
} 

回答

0

这是很难理解你的意思是:

调试时,我注意到第一个小部件te第二个widgetid用于更新

但是,我想我明白你的一般问题:你的AppWidgets没有被正确更新?看过你的代码后,看起来你的问题可能是appWidgetId被声明为静态的。也许尝试删除该关键字。

此外,我没有看到你的代码中的任何地方一个按钮。

编辑

它看起来像你的appWidgetId被覆盖。这里是我的建议,利用作为广播接收器的AppWidgetProvider,而是通过点击PendingIntent按钮发送广播。您还必须确保传递appWidgetId作为额外信息,以确保正确的小部件得到更新。下面是一个例子,应该在你的updateAppWidget方法:

Intent refreshAction = new Intent(); 
refreshAction.setAction(MY_CUSTOM_REFRESH_ACTION); 
refreshAction.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
PendingIntent refreshPendingIntent......... 

然后在的onReceive覆盖:

@Override 
public void onReceive(Context context, Intent intent) { 
    ..... 
    Bundle extras = intent.getExtras(); 
    int appWidgetId = extras.getExtra(AppWidgetManager.EXTRA_APPWIDGET_ID); 
    ..... 
} 

然后你应该准备好了,更新正确的部件。还有一点需要注意,如果你还没有阅读BroadcastReceivers的文档,请务必阅读。您必须注册才能在AndroidManifest的WidgetActivity元素中接受MY_CUSTOM_REFRESH_ACTION。

+0

我试过,但没有结果。 R.id.WidgetRefresh_btn是按钮。我对widgetsId的意思是:第一个小部件用seconde小部件的ID更新(在update-methode中)。所以我认为widgetID被覆盖。 – Johan

+0

再次检查我的答案,我已更新它提供一些代码和应该是一个解决方案。 – icecreamman

+0

哇! Tnx它的工作原理! :) – Johan

相关问题