从onUpdate更改小部件的图标

时间:2009-12-29 21:19:17

标签: android android-widget

我有一个小部件,每次收到更新广播时都会更改其图标。但是,窗口小部件永远无法正确显示其图标,显示文本“问题加载窗口小部件”。 Logcat消息是:

WARN/AppWidgetHostView(612): updateAppWidget couldn't find any view, using error view
WARN/AppWidgetHostView(612): android.widget.RemoteViews$ActionException: can't find view: 0x7f060003

我的onUpdate的代码是:

public class ImageWidgetProvider extends AppWidgetProvider{
private  static final String TAG = "Steve";

public static final int[] IMAGES = { R.drawable.ic_launcher_alarmclock,
    /*and many more*/};

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

    for (int appWidgetId : appWidgetIds) {
        Log.d(TAG, "onUpdate:");
        int imageNum = (new java.util.Random().nextInt(IMAGES.length));
        Log.d(TAG, Integer.toString(IMAGES[imageNum]));
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget);
        remoteView.setImageViewResource(R.id.image_in_widget, IMAGES[imageNum]);
        appWidgetManager.updateAppWidget(appWidgetId, remoteView);
    }

}
}

现在,当我将鼠标悬停在“R.id.image_in_widget”上时,它会显示其值等于0x7f060003 - 根据Logcat无法找到的视图。使用第二个Log语句,我验证了IMAGES [imageNum]确实引用了IMAGES数组中的随机图像。 (如果重要的话,它会以十进制值而不是十六进制值出现。)任何想法我做错了什么?非常感谢!

-

编辑:这是窗口小部件的布局文件,其中声明了image_in_widget ImageView。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView android:name="@+id/image_in_widget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</LinearLayout>

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

这种情况可能发生的另一个原因(对于那些在这个问题上搜索网络的人来说,比原始海报更多):

如果横向与纵向有单独的布局,则两个布局都必须包含您在更新期间引用的所有视图。如果您引用仅存在于一种模式中的视图,例如肖像,那么在横向上您将在窗口小部件框中显示“问题加载窗口小部件”消息。

简单的解决方案是在您不希望出现这些视图的模式下将可见性设置为“GONE”。

答案 2 :(得分:1)

Android 1.5存在无法为小部件调用OnDelete的问题。

将此代码放入AppWidgetProvider中,它应解决问题

public void onReceive(Context context, Intent intent) {
    // v1.5 fix that doesn't call onDelete Action
    final String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        final int appWidgetId = intent.getExtras().getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            this.onDeleted(context, new int[] { appWidgetId });
        }
    } else {
        super.onReceive(context, intent);
    }
}

答案 3 :(得分:0)

也许它不适用于您的示例,但我也有类似应用程序小部件的问题。在Android 1.5中,主屏幕小部件存在恼人的问题。在特定情况下,应用程序小部件仍然在内存中处于活动状态,但不再可见。
您正在通过appWidgetIds枚举,请检查此数组是否包含您期望的ID数。只需放入另一个Log.d()来记录ID。也许你也有一些“鬼”小部件 您使用的是什么Android版本?