2013-05-11 14 views
6

chcę zrobić widżet z listą wewnątrz, trzeba zaimplementować klasę, która rozciąga się od RemoteViewsService, ale ta klasa nigdy wykonać, mój kod jest następujący:RemoteViewsService nie wykonuje,

MyWidgetProvider

public class MyWidgetProvider extends AppWidgetProvider { 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
        int[] appWidgetIds) { 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); 

    Intent updateIntent = new Intent(context, WidgetService.class); 
    for (int appWidgetId : appWidgetIds) { 
     updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME))); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
      views.setRemoteAdapter(appWidgetId, updateIntent); 
     else 
      views.setRemoteAdapter(appWidgetId, R.id.events_list, updateIntent); 

     appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.events_list);   
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 
} 

WidgetService

public class WidgetService extends RemoteViewsService { 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return new WidgetFactory(getApplicationContext(), intent); 
    } 
} 

I Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.widget.example" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" >  

    <receiver android:name=".MyWidgetProvider" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/appwidget_info" /> 
    </receiver> 

    <service android:name=".WidgetService" 
     android:permission="android.permission.BIND_REMOTEVIEWS" 
     android:exported="false"> 
    </service> 

</application> 

Edytuj; znalazłem błąd, muszę używać:

views.setRemoteAdapter(R.id.events_list, updateIntent); 

zamiast

views.setRemoteAdapter(appWidgetId, updateIntent); 

Odpowiedz

1

Zobacz RemoteViews.html#setRemoteAdapter

Funkcja SetRemoteAdapter z 3 parametrów jest przestarzałe w poziomie API 14+, a nawet jeśli wywołałeś 3 parametry jeden, parametr id widgetu jest ignorowany. Tak więc funkcja zawsze otrzymuje tylko 2 prawidłowe parametry, tj. View_id i intent.

Ta funkcja zasadniczo mówi, że zamierzam użyć intencji jako źródła danych dla widoku (wskazanego przez view_id).

0

dla mnie to działa

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    for (int widgetId : appWidgetIds) { 
     RemoteViews mView = initViews(context, appWidgetManager, widgetId); 
     appWidgetManager.updateAppWidget(widgetId, mView); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 



@SuppressWarnings("deprecation") 
@SuppressLint("NewApi") 
private RemoteViews initViews(Context context, 
           AppWidgetManager widgetManager, int widgetId) { 

    RemoteViews mView = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 

    Intent intent = new Intent(context, WidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 

    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
    mView.setRemoteAdapter(widgetId, R.id.widgetCollectionList, intent); 

    return mView; 
}