【问题标题】:OnUpdate NEVER called - Android WidgetOnUpdate 从未调用过 - Android Widget
【发布时间】:2012-03-16 20:38:04
【问题描述】:

我一直在关注各种 Widget 教程,例如 this onethis one

我尝试过根据我的目的调整他们的代码,并且尝试过直接复制粘贴。 似乎无论我做什么,我的小部件都不会更新。当它被放置在主屏幕上时,文本保持为创建它的静态文本。 我需要这个应用程序做的就是更新 4 个将包含在布局中的 TextView。

下面的代码大部分是从其中一个教程中复制而来的。我已经尝试调试 onUpdate 方法,但似乎从未命中断点。

任何帮助将不胜感激。

编辑:我恢复到这个小部件的一个更简单的版本,我在我之前的努力中尝试过,并将下面的代码替换为更简单的小部件的代码。我对我的清单进行了 CommonsWare 建议的更改。不幸的是,问题仍然存在。

我的主 .java 文件如下所示:

public class NetStatWidget extends AppWidgetProvider 
{

public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds)
{   
    ComponentName thisWidget = new ComponentName(context, NetStatWidget.class);
    int[] widgetId = manager.getAppWidgetIds(thisWidget);

    RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.appwidget);
    remoteView.setTextViewText(R.id.textView0, "Hello");
    manager.updateAppWidget(widgetId, remoteView);
}

}

我的清单:

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

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >


            <receiver android:name="NetStatWidget" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data 
                    android:name="android.appwidget.provider"
                    android:resource="@xml/providerinfo" />
            </receiver>

    </application>

</manifest>

还有我的小部件提供者信息:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/main"
android:minWidth="146dip"
    android:minHeight="72dip"
    android:updatePeriodMillis="10000">

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    您的清单有误。你声称你有一个 network.widget.AppWidgetProvider 类,而 AFAIK,你没有。你有一个奇怪的名字network.widget.NetworkWidgetActivity 类。您需要在 &lt;receiver&gt; 元素中使用 that

    还有:

    • this.getApplicationContext()getApplicationContext() 替换为this

    • 除非您打算在服务中做更严肃的工作(数据库 I/O、网络 I/O 等),否则请考虑将所有逻辑移入 onUpdate() 并摆脱该服务,因为在这里并没有真正给你带来太多好处(如果你要保留这项服务,请切换到IntentService 并摆脱stopSelf(),因为这是为你处理的)

      李>
    • 当您要求 10 秒更新时,updatePeriodMillis 的最短有效时间为 30 分钟 - 请在调试时记住这一点

    • int[] widgetId 似乎没有在NetworkWidgetActivity 中使用

    • onStart() 中的Service 已被弃用几年;改用onStartCommand()

    【讨论】:

    • 我根据您的建议更改了我的清单,但我仍然遇到同样的问题...我恢复到我在开始努力时尝试的更简单的小部件,进行了同样的更改,它是有同样的问题。我编辑了上面的代码以反映更简单的代码。你看到同样的问题吗?
    • @Jodron:不,您所拥有的应该可以在 Android 3.0 及更低版本上运行。 Android 3.1 及更高版本,您需要一个活动来与您的应用小部件一起使用——在用户运行活动之前,您的应用小部件将不会收到任何广播。此目录包含另外两个应用小部件示例,它们都可以工作:github.com/commonsguy/cw-advandroid/tree/master/AppWidget
    • 这很奇怪。我在 2.3 上运行它,它仍然不会更新文本。我认为一旦放置小部件“textView0”就应该读取“Hello”,我错了吗?感谢您提供的示例,我会查看这些示例,看看我是否无法弄清楚。我想我可能会不知所措,应该让它成为一个普通的应用程序。
    • @Jodron:“我认为一旦放置小部件“textView0”就应该读取“Hello”,我错了吗?” -- 好吧,在一秒钟左右,假设在res/layout/appwidget.xml 中有一个名为@+id/textView0TextView。尽管您在那里列出的代码不会编译,因为没有widgetId。考虑暂时切换到采用ComponentNameupdateAppWidget() 版本,这样您就不会迷失在应用小部件ID 中。
    • 更改 updateAppWidget 以使用组件名称已修复!非常感谢你帮助我度过了无知的阴云。现在再花 5 个小时自学如何用网络信息填充这些 textView。再次感谢市民。
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多