Android 小部件不响应触摸

2024-02-29

我正在尝试一些非常简单的代码来运行 Android 小部件,但没有成功。我环顾四周,但没有找到好的答案。

我现在想要的只是在触摸小部件时增加计数器并显示当前值。

这是我的 AppWidgetProvider:

public class WordWidget extends AppWidgetProvider
{
    Integer touchCounter = 0;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
        //This is run when a new widget is added or when the update period expires.
        Log.v("wotd",  "Updating " + appWidgetIds.length + " widgets");

        for(int x = 0; x < appWidgetIds.length; x++)
        {
            Integer thisWidgetId = appWidgetIds[x];

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
            remoteViews.setTextViewText(R.id.mainText, touchCounter.toString());

            Intent widgetIntent = new Intent(context, WordWidget.class);
            widgetIntent.setAction("UPDATE_NUMBER");

            PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0);

            remoteViews.setOnClickPendingIntent(R.id.widgetLinearLayout, widgetPendingIntent);
            appWidgetManager.updateAppWidget(thisWidgetId, remoteViews);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.v("wotd", "In onReceive with intent=" + intent.toString());
        if (intent.getAction().equals("UPDATE_NUMBER"))
        {
            Log.v("wotd", "In UPDATE_NUMBER");
            touchCounter++;
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
            remoteViews.setTextViewText(R.id.mainText, touchCounter.toString());
        } else
        {
            Log.v("wotd", "In ELSE... going on to super.onReceive()");
            super.onReceive(context, intent);
        }
    }
}

这是我的清单的一部分:

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

    <receiver
        android:icon="@drawable/ic_launcher"
        android:name="com.example.mywidget.WordWidget"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="UPDATE_NUMBER" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widgetinfo" />
    </receiver>

</application>

日志显示 onReceive() 在放置到主屏幕后以及被触摸后立即被调用,但数量从未增加。我不完全理解小部件是如何工作的,但是它们在 onUpdate() 之后会被杀死吗?那么为此我必须使用某种持久存储吗?

另外,如果我当前添加另一个小部件,即使我只触摸一个小部件,它们也会显示相同的值和增量。有没有办法让每个小部件都有自己的计数器?

Thanks!


其实你已经回答了你的问题。但让我们澄清一些事情:

答:只要 AppWidget 位于主屏幕上,它们就不会被杀死。但它们不属于你。它们正在家庭应用程序的进程中运行。更具体地说,他们的视图在主应用程序的进程中运行,这就是为什么您可以看到您的小部件,但它没有执行您期望的操作,这就是为什么我们使用 RemoteViews 而不是视图来更新它们。

B. 另一方面,一旦 onReceive 方法完成,AppWidgetProviders(在您的例子中是 WordWidget 类)就会被销毁。每次调用 onReceive 方法时,其中的所有变量都会重新初始化。这就是为什么你的数字永远不会增加。 AppWidgetProvider 的目的是更新小部件的 RemoteViews 并通知您的应用程序已注册的广播已到达。

C. AppWidgetProvider 的 onUpdate 方法为您提供一个包含必须更新的小部件 Id 的数组。这是您可以用来获取小部件实例数量及其 ID 的唯一代码点。由于 RemoteViews,无法从小部件的视图中获取一些有用的值(例如,您无法从 TextView 读取计数器值),因此您必须使用提供的信息和一定要坚持每个小部件 ID 的计数器值。当调用下一个 onUpdate 时,您从存储中读取值,增加它,用新值更新小部件,然后将新值存储回来。

D. 如果您的小部件在自我更新时必须执行许多操作或速度较慢(例如网络),那么您应该考虑为此使用服务。但在您的情况下(增加数字),只要您将计数器保留在持久存储或其他地方,您的方法就可以了。

最后我注意到,在您的 onReceive 覆盖中,仅当您没有收到“UPDATE_NUMBER”操作时,您才会调用“super.onReceive”。这不是一个好的做法,除非有充分的理由(这是另一个故事)总是调用 super.onReceive 作为覆盖中的第一个或最后一个命令。

希望这可以帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 小部件不响应触摸 的相关文章

随机推荐

  • 是否可以使用 django 模型将数组存储在 mysql 数据库中?

    我有一个值数组并想存储在mysql数据库使用django模型 py 我可以通过哪些方式存储数组值 在 的帮助下django mysql我们可以将列表存储到数据库中 为此你必须安装 django mysql pip install djang
  • 如何使用 ggplot2 在直方图条上显示百分比标签

    我看到很多关于将 y 轴上的计数转换为百分比的问题 但其中必须在条形图中 我想在直方图中做类似的事情 但无法清楚地显示条形图上的标签 请告诉我我哪里做错了 x runif 100 min 0 max 10 data1 lt data fra
  • 从 .git 文件夹恢复整个项目[重复]

    这个问题在这里已经有答案了 我有一个网络项目 我已经工作了一段时间了 我使用 GIT 和 SourceTree 来跟踪更改 但愚蠢地没有适当的备份 我有大约 50 次提交 想要清理干净并从新的初始状态开始 所以我删除了 git 文件夹 但是
  • 强类型 ActionLink 的注意事项

    我一直在尝试查找有关 Futures 中首次亮相的强类型 ActionLink 辅助方法的更多信息 我知道使用它有一些很大的缺点 但想了解更多 我发现的最好的链接是这个 Asp Net MVC 2 中的强类型 ActionLink http
  • laravel uuid 作为主键

    我正在尝试将 uuid 设置为 Laravel 模型中的主键 我已经完成了在我的模型中设置启动方法的工作here https github com webpatser laravel uuid所以我不必每次想要创建和保存模型时都手动创建它
  • 通过 mutableCopy 或 arrayWithArray 创建带有文字的 NSMutableArray:[重复]

    这个问题在这里已经有答案了 可能的重复 NSMutableDictionary 的字面创建是否比类帮助器方法效率低 https stackoverflow com questions 12426786 is literal creation
  • java 中的 PHP 相似文本()

    你知道 PHP 的任何严格等效的实现吗相似文本 https www php net manual en function similar text phpJava 中的函数 这是我在java中的实现 package comwebndesig
  • Wix:如何设置文件夹和所有子文件夹的权限

    我知道如何设置文件夹的权限
  • LINQ“无法检测到以下存储过程的返回类型”(不是临时表)

    长期潜伏者 第一次在这里发帖 我决定在这里问 因为我已经厌倦了在谷歌等搜索 将存储过程从 SQL 2005 DB 导入到网站 FW 4 0 C LINQ 项目时 我遇到此错误 无法检测到以下存储过程的返回类型 我有两个疑问 我想指出的是 我
  • 我的页脚浮动

    在三天的大部分时间里 我一直在尝试各种 粘性 页脚解决方案 但没有成功 当没有足够的内容来跨越窗口的整个高度时 我试图将页脚放置在浏览器窗口的底部 请 帮助 这是基本的网站结构 div div
  • 在 dotnetcoreapp2.0 中使用 UnobservedTaskException 处理程序

    以下代码在 netcoreapp2 0 应用程序中运行时 似乎最终不会抛出UnobservedTaskException using System using System Threading using System Threading
  • 如何从文本中查找数字

    这是我的数据框中 pyspark 列 字符串 的一个小示例 column new column Hoy es d a de ABC KE98789T983456 clase
  • Gulp.js - 在连接时重写嵌入在 css 中的 url

    我正在使用 Gulp 连接来自不同目录的多个 css 文件 Bower 管理的依赖项 Font awesome 是这些依赖项之一 它包含对其字体的相对引用url font 当 css 文件连接并放置在不同的目录中时 这个相对 url 显然是
  • 为什么依赖属性中的 get/set 没有执行任何操作?

    我创建了一个像这样的依赖属性 public partial class MyControl UserControl public static DependencyProperty XyzProperty DependencyPropert
  • 如何将密码显示为星号[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个登录窗口 提示用户输入用户名和密码 尽管输入密码时我正在寻找要打印的星号 例如常见的密码输入 即 Sekr3t 回显为 这是我到目前为止的代码 我不明白为什么它不回显星号 import msvc
  • 一个好的、免费的、简单的、非“试用”的本地 SMTP 服务器用于开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DAX 条件总和

    如何构造返回 A 或 B 之和的 DAX 度量 逻辑是如果 A 为空 则取 B 所以预期的结果如下所示 A B Expected 1 1 1 1 2 2 1 2 1 2 2 3 6 7 当我使用测量时 Measure IF ISBLANK
  • Spark编程中什么时候应该使用groupByKey API?

    GroupByKey 会遭受数据混洗的困扰 而 GroupByKey 功能可以通过使用 mergeByKey 或 reduceByKey 来实现 那么什么时候应该使用这个 API 有使用案例吗 组合和减少最终也会进行洗牌 但它们具有更好的内
  • 当 Doctrine 查询具有连接时,setMaxResults 无法正常工作

    我想编写一个 DQL 查询来选择发布并加入另一个实体 这是我的代码 dql SELECT p h t m FROM App Post p LEFT JOIN p mentions m LEFT JOIN p tags t LEFT JOIN
  • Android 小部件不响应触摸

    我正在尝试一些非常简单的代码来运行 Android 小部件 但没有成功 我环顾四周 但没有找到好的答案 我现在想要的只是在触摸小部件时增加计数器并显示当前值 这是我的 AppWidgetProvider public class WordW