2011-06-22 27 views
4

這是我的代碼...如何在AppWidgetProvider中調用onUpdate()?

String[] show = new String[2]; 
RemoteViews remoteViews; 
public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; 
public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 

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

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
    remoteViews.setTextViewText(R.id.widget_title, show[0]); 
    remoteViews.setTextViewText(R.id.widget_textview, show[1]); 

    Intent configIntent = new Intent(context, SuitAuto.class); 
    configIntent.setAction(ACTION_WIDGET_CONFIGURE); 

    Intent active = new Intent(context, WordWidget.class); 
    active.setAction(ACTION_WIDGET_RECEIVER); 
    active.putExtra("msg", "Message for Button 1"); 

    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
    PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0); 

    remoteViews.setOnClickPendingIntent(R.id.update, actionPendingIntent); 
    remoteViews.setOnClickPendingIntent(R.id.Lilo, configPendingIntent); 

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
} 

private String[] getString() { 
    String[] hon = new String[2]; 
    KamusWidget ad = new KamusWidget(null); 
    ad.open(); 
    hon = ad.getwordday(); 
    ad.close(); 
    return hon; 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    // v1.5 fix that doesn't call onDelete Action 
    final String action = intent.getAction(); 
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
     final int appWidgetId = intent.getExtras().getInt(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 

     if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
      this.onDeleted(context, new int[] { appWidgetId }); 
     } 
    } else { 
     // check, if our Action was called 
     if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { 
      String msg = "null"; 
      try { 
       msg = intent.getStringExtra("msg"); 
      } catch (NullPointerException e) { 
       Log.e("Error", "msg = null"); 
      } 
      Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 


     } else { 
      // do nothing 
     } 

     super.onReceive(context, intent); 
    } 
} 

} 

我只是想widget_title更新和widget_textview時R.id.update點擊 它應該運行功能的getString從其他類取字符串,這樣,新的字符串可以傳遞給textview ...

有什麼想法嗎?

回答

3

onReceive函數結束時,你應該能夠只需要創建一個遠程視窗和更新的窗口小部件:

ComponentName name = new ComponentName(context, WordWidget.class); 
int[] ids = appWidgetManager.getAppWidgetIds(name); 
if(ids != null && ids.length > 0){ 
RemoteView remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
remoteViews.setTextViewText(R.id.widget_title, context.getString(R.id.new_widget_title)); 
remoteViews.setTextViewText(R.id.widget_textview, context.getString(R.id.new_widget_text)); 

Intent configIntent = new Intent(context, SuitAuto.class); 
configIntent.setAction(ACTION_WIDGET_CONFIGURE); 

Intent active = new Intent(context, WordWidget.class); 
active.setAction(ACTION_WIDGET_RECEIVER); 
active.putExtra("msg", "Message for Button 1"); 

PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0); 

remoteViews.setOnClickPendingIntent(R.id.update, actionPendingIntent); 
remoteViews.setOnClickPendingIntent(R.id.Lilo, configPendingIntent); 

appWidgetManager.updateAppWidget(ids, remoteViews); 
} 

我相信你會還需要設置意圖:如果你不這樣做的一旦更新RemoteView,按鈕將不再起作用。

+1

不清楚我們如何在你的例子中獲得appWidgetManager「變量」,我遇到了類似的問題,我通過遠程視圖更新textview,但它似乎並沒有真正改變文本。 – onaclov2000

+2

如果你有一個上下文(任何上下文,比如一個Activity或一個服務),你應該可以執行'AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);':我在Service中使用它來更新一個顯示的小部件一個藍牙傳感器的價值。 – Femi

+0

我一直在閱讀http://stackoverflow.com/questions/23220757/android-widget-onclick-listener-for-several-buttons並試圖讓它工作幾天。最後,我在上面的AppWidgetManager註釋中找到了這個答案,並且我終於能夠正常工作。給予好評! – raddevus

0

我相信

Intent active = new Intent(context, WordWidget.class); 
active.setAction(ACTION_WIDGET_RECEIVER); 

應該

Intent active = new Intent(ACTION_WIDGET_RECEIVER); 

,如果他們的目的不是用一個簡單的字符串實例化廣播PendingIntents不起作用。由於某種原因,setAction()不會做同樣的事情。

相關問題