2011-03-22 47 views
1

我有一個小部件,可以從2種尺寸中進行選擇,它也有一個配置。出於某種原因,經過一段時間後,我的小部件上的按鈕將解除綁定,您將無法點擊任何內容。我不知道爲什麼會發生這種情況。它可能是我的OnRecieve方法中的super.onReceive(上下文,意圖)?會導致它可能解綁嗎?還有什麼確定的火方式來確保按鈕總是綁定?android AppWidget按鈕解除綁定

的AppWidgetProvider

public class mWidget extends AppWidgetProvider { 
    public static String ACTION_WIDGET_REFRESH = "Refresh"; 
    public static final String PREFS_NAME = "mWidgetPrefs"; 

@Override 
public void onEnabled(Context context) { 

} 

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

     RemoteViews remoteViews = buildLayout(context); 

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 


} 
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
     int appWidgetId) { 
    RemoteViews views = buildLayout(context); 

    appWidgetManager.updateAppWidget(appWidgetId, views); 
} 

public static RemoteViews buildLayout(Context context) { 


    RemoteViews remoteView = new RemoteViews(context.getPackageName(), 
      R.layout.widget_4x2); 
    Intent intent = new Intent(context, mWidget.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
      intent, 0); 

    intent = new Intent(context, mWidget.class); 
    intent.setAction(ACTION_WIDGET_REFRESH); 
    pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
    remoteView.setOnClickPendingIntent(R.id.refresh, pendingIntent); 

    return remoteView; 

} 

@Override 
public void onReceive(Context context, Intent intent) { 



     RemoteViews remoteView = null; 
     remoteView = new RemoteViews(context.getPackageName(), 
       R.layout.widget_4x2); 
     if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) { 
Toast.makeText(context, "here", Toast.LENGTH_LONG).show(); 

     } else { 
      super.onReceive(context, intent); 
     } 


} 

} 艙單

<?xml version="1.0" encoding="utf-8"?> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".mwidgetConfig" android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".mwidgetConfigSmall" 
     android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
     </intent-filter> 
    </activity> 
    <!-- BEGIN 4X4 WIDGET --> 
    <receiver android:label="Test Widget 4x4" 
     android:name="com.test.mwidget.mWidget"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      <action 
       android:name="com.test.mwidget.mWidget.ACTION_WIDGET_REFRESH" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
      android:resource="@xml/widget_4x4_provider" /> 
    </receiver> 
    <!-- BEGIN 4X2 WIDGET --> 
    <receiver android:label="Test Widget 4x2" 
     android:name="com.test.mwidget.mWidgetSmall"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      <action 
       android:name="com.test.mwidget.mWidgetSmall.ACTION_WIDGET_REFRESH" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
      android:resource="@xml/widget_4x2_provider" /> 
    </receiver> 

</application> 

回答

2
  1. 您應該在每個onUpdate事件上綁定您的未決意圖。
  2. 您應該遍歷所有appWidgerIds

通常情況下,我實現了部件的東西,如下:

public void onUpdate(Context context, 
         AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
     updateAllWidgetsInternal(context, appWidgetManager, appWidgetIds); 
    } 

    private static void updateAllWidgetsInternal(Context context, 
               AppWidgetManager appWidgetManager, 
               int[] appWidgetIds) { 
     final RemoteViews views = buildLayout(context); 

     final int N = appWidgetIds.length; 
      for (int i=0; i<N; ++i) { 
      appWidgetManager.updateAppWidget(appWidgetIds[i], views); 
     } 
    } 

    // This function can be executed anywhere in any time to update widgets 
    public static void updateAllWidgets(Context context) { 
     final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     final int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, mWidget.class)); 
     updateAllWidgetsInternal(context, appWidgetManager, appWidgetIds); 
} 
0

我不明白你爲什麼執行onReceive()

,如果你的小部件配置爲趕上其他節目播出超過標準的部件,其是ACTION_APPWIDGET_DELETEDACTION_APPWIDGET_DISABLEDACTION_APPWIDGET_ENABLEDACTION_APPWIDGET_UPDATE這只是必要的。

如果沒有必要,請嘗試不使用onReceive()

+0

我廣播ACTION_WIDGET_REFRESH這不是廣播 – ninjasense 2011-03-22 18:27:43

+0

我不知道這個廣播標準的部件,它是你的嗎? – tbruyelle 2011-03-22 18:31:09