2012-08-16 2 views
2

J'ai essayé de faire fonctionner un widget redimensionnable, mais ce n'est pas le cas. J'ai une base de données que j'utilise avec greenDAO. Donc, mon application devrait fonctionner sur Android 2.3+. Voilà pourquoi je veux avoir obtenu les widgets suivants:Widget défilable non rempli

  • 4x2 avec 2 articles
  • 4x3 avec 3 articles
  • 4x4 avec 4 articles
  • 4x5 avec 5 articles

En preHoneycomb ces Widgets devraient juste montrer les premiers articles et ouvre l'application sur le clic.

Dans Android 3+ ces widgets devraient être réalisables et défilables. Mon problème est que ma classe Widget Service n'est jamais appelée. Donc, rien dans le widget sera rempli: -

Voici mon code:

public class WidgetProvider extends AppWidgetProvider { 

private static final String TAG = "WidgetProvider"; 

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

    Log.i(TAG, "Update!!"); 

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

     Intent intent = new Intent(context, TimetableActivity_.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
       intent, 0); 

     Intent svcIntent = new Intent(context, WidgetService.class); 
     svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       appWidgetIds[i]); 
     svcIntent.setData(Uri.parse(svcIntent 
       .toUri(Intent.URI_INTENT_SCHEME))); 

     RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.widget); 
     views.setOnClickPendingIntent(R.id.img_widget_home, pendingIntent); 
     views.setRemoteAdapter(R.id.btn_widget_refresh, svcIntent); 

     Intent update = new Intent(context, WidgetProvider.class); 

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

     PendingIntent pend = PendingIntent.getBroadcast(context, 0, update, 
       PendingIntent.FLAG_UPDATE_CURRENT); 

     views.setOnClickPendingIntent(R.id.btn_widget_refresh, pend); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

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


@TargetApi(11) 
public class WidgetService extends RemoteViewsService { 

    private static final String TAG = "WidgetService"; 

    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 

     Log.i(TAG, "WidgetService called"); 

     return new ListRemoteViewsFactory(this.getApplicationContext(), 
       (TimetableApplication_) this.getApplication(), intent); 
    } 
} 

class ListRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { 
    private static final String TAG = "ListRemoteViewsFactory"; 

    private Context mContext; 

    private TimetableApplication_ application; 
    private List<Events> events = new ArrayList<Events>(); 

    public ListRemoteViewsFactory(Context context, 
      TimetableApplication_ application, Intent intent) { 
     this.mContext = context; 
     this.application = application; 
    } 

    public int getCount() { 
     return events.size(); 
    } 

    public RemoteViews getViewAt(int position) { 
     Log.i(TAG, ""+getCount()); 

     String title = ""; 
     String description = ""; 
     Events e; 

     if ((e = events.get(position)) != null) { 
      title = e.getSubjects().getTitle(); 
      description = e.getStart().toGMTString(); 
     } 

     RemoteViews rv = new RemoteViews(mContext.getPackageName(), 
       R.layout.widget_item); 
     rv.setTextViewText(R.id.txt_widget_item_title, title); 
     rv.setTextViewText(R.id.txt_widget_item_description, description); 

     return rv; 
    } 

    public RemoteViews getLoadingView() { 
     return null; 
    } 

    public int getViewTypeCount() { 
     return 1; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public boolean hasStableIds() { 
     return true; 
    } 

    public void onDataSetChanged() { 
     if (events != null) { 
      events.clear(); 
     } 

     events = application.getEvents(); 
    } 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public void onDestroy() { 
    } 
} 

Et voici mon fichier Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="de.mprengemann.hwr.timetabel" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="15" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.READ_CALENDAR" /> 
    <uses-permission android:name="android.permission.WRITE_CALENDAR" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:name=".TimetableApplication_" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/TimetableTheme" > 
     <activity 
      android:name=".TimetableActivity_" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".PreferenceActivity_" 
      android:label="@string/menu_settings" > 
     </activity> 
     <activity android:name=".SubjectDetailActivity_" > 
     </activity> 

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

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

     <service android:name=".widget.WidgetService" /> 
     <service android:name=".widget.ListWidgetService" /> 
    </application> 

</manifest> 

Merci pour votre aide! :-)

Répondre

4

Désolé, je sais que c'est un ancien poste, mais il se pourrait que votre problème est que vous n'avez pas inclus une autorisation obligatoire pour votre sevice widget dans le fichier manifeste ....

Vous pourriez essayez de changer:

<service android:name=".widget.WidgetService" /> 

Pour

<service android:name=".widget.WidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" /> 
Questions connexes