You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Widget(Kotlin):加载时禁用刷新按钮避免重复请求

解决Android Widget刷新按钮重复点击问题

要实现加载期间阻止重复点击,你可以通过点击后立刻更新Widget视图,禁用/隐藏刷新按钮的方式来解决,具体步骤如下:

核心思路

Widget的视图更新必须通过AppWidgetManager完成,虽然无法在发送广播前直接修改按钮状态,但可以在接收到刷新广播的第一时间更新按钮状态,让用户无法重复触发请求,同时避免点击音效。

具体实现代码

在你的NewstickerListAppWidgetProvider的onReceive方法中,按以下逻辑处理:

override fun onReceive(context: Context, intent: Intent) {
    super.onReceive(context, intent)
    val appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
    if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) return

    when (intent.action) {
        ACTION_UPDATE_LIST -> {
            val appWidgetManager = AppWidgetManager.getInstance(context)
            val views = RemoteViews(context.packageName, R.layout.widget_newsticker)

            // 1. 立即禁用刷新按钮:移除点击事件+隐藏按钮(或替换为加载动画)
            views.setOnClickPendingIntent(R.id.image_reload, null) // 移除点击触发逻辑
            views.setViewVisibility(R.id.image_reload, View.INVISIBLE)
            // 可选:显示加载进度条
            views.setViewVisibility(R.id.widget_progress, View.VISIBLE)

            // 立即更新Widget,让用户看到状态变化
            appWidgetManager.updateAppWidget(appWidgetId, views)

            // 2. 执行异步数据加载(用协程/WorkManager处理,避免阻塞onReceive)
            CoroutineScope(Dispatchers.IO).launch {
                val newsList = fetchNewsData() // 你的数据请求逻辑

                // 3. 加载完成后恢复按钮状态并更新列表
                val updatedViews = RemoteViews(context.packageName, R.layout.widget_newsticker)
                // 恢复刷新按钮的点击事件和可见性
                updatedViews.setViewVisibility(R.id.image_reload, View.VISIBLE)
                updatedViews.setOnClickPendingIntent(
                    R.id.image_reload,
                    context.pendingBrodcastIntent<NewstickerListAppWidgetProvider>(
                        appWidgetId,
                        ACTION_UPDATE_LIST
                    )
                )
                // 隐藏加载进度条
                updatedViews.setViewVisibility(R.id.widget_progress, View.GONE)
                // 更新列表数据(根据你的Widget列表实现调整)
                updatedViews.setRemoteAdapter(R.id.news_list, Intent(context, NewsListRemoteViewsService::class.java))
                appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.news_list)

                // 最终更新Widget
                withContext(Dispatchers.Main) {
                    appWidgetManager.updateAppWidget(appWidgetId, updatedViews)
                }
            }
        }
    }
}

关键细节

  • 点击按钮后立刻移除其PendingIntent,这样后续点击不会触发广播,自然也不会有点击音效,和你提到的“DER SPIEGEL”效果一致。
  • 异步加载必须放在后台线程(协程/WorkManager),不能在onReceive中直接执行耗时操作,否则会导致广播超时。
  • 加载完成后务必恢复按钮的点击事件和可见性,保证后续正常使用。

内容的提问来源于stack exchange,提问作者Franklin84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:25:18