7

我想做一个里面有一个列表的小部件,我必须实现一个扩展 RemoteViewsService 的类,但是这个类永远不会执行,我的代码如下:

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);
}
}

小部件服务

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

和清单

<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>

编辑; 我发现了错误,我必须使用:

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

代替

views.setRemoteAdapter(appWidgetId, updateIntent);
4

2 回答 2

1

请参阅RemoteViews.html#setRemoteAdapter

具有 3 个参数的 SetRemoteAdapter 函数在 API 级别 14+ 中已弃用,即使您调用 3 个参数之一,widget id 参数也会被忽略。所以函数总是只接收2个有效参数,即view_id和intent。

这个函数基本上说我将使用意图作为视图的数据源(由 view_id 表示)。

于 2013-09-04T18:37:11.610 回答
0

对我来说这有效

 @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;
}
于 2016-11-04T08:30:02.943 回答