Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改小部件';来自onUpdate的s图标_Android_Android Widget - Fatal编程技术网

Android 更改小部件';来自onUpdate的s图标

Android 更改小部件';来自onUpdate的s图标,android,android-widget,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: 0x7f06

我有一个小部件,它可以在每次收到更新广播时更改其图标。然而,小部件从未正确显示其图标,显示文本“问题加载小部件”。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数组中的随机图像。(以防万一,它是十进制值,而不是十六进制值。)你知道我做错了什么吗?非常感谢

--

编辑:这里是小部件的布局文件,其中声明了小部件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>

也许它不适用于您的示例,但我在应用程序小部件方面也有类似的问题。在安卓1.5中,主屏幕小部件有一个恼人的问题。在特定情况下,应用程序窗口小部件在内存中仍处于活动状态,但不再可见。
如果要通过AppWidgetId进行枚举,请检查此数组是否包含预期的ID数。只需放置另一个Log.d()来记录ID。也许你也有一些“幽灵”小部件。

您使用的android版本是什么?

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

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

如果横向和纵向有单独的布局,则这两个布局都必须包含更新期间引用的任何视图。如果您引用的视图仅在一种模式下存在,比如纵向,那么在横向中,您将在小部件框中看到“加载小部件时出现问题”消息


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

有趣。。。我确实在为Android v1.5编程。这就解释了我在Logcat中看到的一些奇怪的事情——我删除了另一个小部件的调试行。我刚刚尝试添加更多的调试行,它从37开始计数(尽管我在主屏幕上没有那么多小部件),但正确地说,数组只有一个条目。这告诉我们什么?对我来说,这似乎意味着这不是问题的根源,但请让我知道你的想法。事实上,在你的情况下,这不是问题的根源。但是你的代码似乎还可以,所以你可以提供一些额外的信息:1。如何更新您的小部件(手动或通过您的appwidget提供程序文件中的android:updatePeriodMillis)?2.我假设您的小部件布局文件包含id为image\u的ImageView,对吗?3.是否在appwidget提供程序中设置初始布局?1。我尝试通过一个广播意图的配置活动来更新它,更简单的是使用xml文件中的android:updatePeriodMillis行。2.确实如此。据我所知,id是正确识别的,因为它在R.java文件中给定了一个值。3.没有,我没有在其他地方设置初始布局。我会试着这样做,看看会发生什么。事实上,到目前为止我读到的所有示例似乎都没有声明初始布局,所以除非你认为我应该这样做,否则我将保持代码不变。顺便说一下,我已经在上面的主要文章中添加了小部件的xml布局。再次感谢您迄今为止的帮助!真奇怪。看来你做的每件事都是对的。如果在布局文件中使用了允许的UI组件,它应该可以正常工作。这个“问题加载小部件”在您将小部件放到屏幕上后立即显示,对吗?我真的不知道是什么原因。。。很抱歉可能尝试在1.6 emulator上运行您的小部件?是的,“问题加载小部件”会立即显示。在v1.6 emulator中也是如此。谢谢你的尝试——我很高兴看到不仅仅是我觉得这很奇怪:)谢谢。我以前见过这个bug,但我认为它与此无关,但在这个编程过程中,我的直觉已经被证明是错误的。。。一旦我回到这个项目,我会尝试一下。砰,这解决了一些可能需要几个小时才能解决的问题。谢谢你的提示。我刚刚用api 10进行了测试,类似这样的测试就是原因。我正在设置没有出现在所有布局中的视图的属性。在以后的api版本中,这似乎不再是一个问题(这些调用被忽略)。