相关疑难解决方法(0)

onGetViewFactory只为多个小部件调用一次

我有一个使用的appwidget ListView.我创建了一个扩展的类RemoteViewsService:

public class AppWidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return (new AppWidgetListFactory(this.getApplicationContext(), intent));
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的AppWidgetProvider,我为每个小部件实例(每个appWidgetId)调用以下方法:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) {
    Intent intent = new Intent(context, AppWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    widget.setRemoteAdapter(R.id.appwidget_listview, intent);
}
Run Code Online (Sandbox Code Playgroud)

的构造函数 AppWidgetListFactory

public AppWidgetListFactory(Context context, Intent intent) {
    this.context = context;
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

    System.out.println("New TVAPWLF for: " + appWidgetId);
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId);
}
Run Code Online (Sandbox Code Playgroud)

现在问题是,该fillInList方法被调用的方式与小部件的实例一样频繁,但该onGetViewFactory方法只被调用一次.这导致所有小部件显示相同的数据.

我怎样才能解决这个问题?

android android-appwidget

13
推荐指数
1
解决办法
3189
查看次数

Android AppWidgetManager方法updateAppWidget无法设置意图,加载数据.它随机发生

我的小部件由2个按钮和一个显示数据的列表视图组成.大多数情况下,当调用窗口小部件提供程序的onUpdate方法时,一切都正常加载,每个人都很高兴.

但是我注意到有时在调用update方法之后,widget完全无法加载其数据.列表视图为空,并且所有按钮都没有响应.就像我将布局初始化到窗口小部件中一样,但没有设置挂起的意图和列表的适配器.

我记录了一切,发现事实并非如此.每次都会创建挂起的意图,以及列表适配器,包括失败时的随机时间.很长一段时间以来,我认为它与列表数据如何填充到适配器中有关,但每次都看到它工作,再加上按钮意图不能正常工作的事实让我相信方法updateAppWidget (ComponentName,RemoteViews)是失败的.但是,没有错误堆栈可以帮助我确认这一点.

以下是在AppWidgetProvider的onUpdate方法调用的单独服务中运行的代码:

@SuppressWarnings("deprecation")
private void updateWidget(int[] ids) {

    AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
    int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));

    for (int currentWidgetId : widgetIds) {

        RemoteViews widget = new RemoteViews(this.getPackageName(), R.layout.widget_layout);

        Intent intent = new Intent(this, WidgetService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
        intent.putExtra("random", randomNumber);
        randomNumber++;
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

        widget.setRemoteAdapter(currentWidgetId, android.R.id.list, intent);

        Intent clickIntent = new Intent(this, DetailsActivity.class);
        PendingIntent pending = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        widget.setPendingIntentTemplate(android.R.id.list, pending);

        Intent settingsIntent = new Intent(this, WidgetSettingsActivity.class);
        settingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent settingsPending = PendingIntent.getActivity(this, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        widget.setOnClickPendingIntent(R.id.widget_settings, settingsPending); …
Run Code Online (Sandbox Code Playgroud)

android android-appwidget

8
推荐指数
1
解决办法
4529
查看次数

标签 统计

android ×2

android-appwidget ×2