【问题标题】:Can't call setFormat24Hour of a TextClock in a Widget无法在小部件中调用 TextClock 的 setFormat24Hour
【发布时间】:2014-03-31 21:40:10
【问题描述】:

我正在尝试动态更新 Widget 的 TextClock 的 format24Hour

为此,我正在使用这样的 RemoteViews:

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clockwidget);
views.setString(R.id.textclock, "setFormat24Hour", formatString24.toString());
appWidgetManager.updateAppWidget(appWidgetId, views);

然而,这会导致我的小部件显示“问题加载小部件”并且 logcat 显示

 03-31 17:37:19.872: W/AppWidgetHostView(1408): updateAppWidget couldn't find any view, using error view
 03-31 17:37:19.872: W/AppWidgetHostView(1408): android.widget.RemoteViews$ActionException: view: android.widget.TextClock doesn't have method: setFormat24Hour(class java.lang.String)

但是我很确定android.widget.TextClock 有一个方法setFormat24Hour(CharSequence format) 被标记为@RemotableViewMethod

我有什么遗漏吗?为什么这不起作用?

【问题讨论】:

  • 您可能需要将字符串显式转换为 CharSequence? (虽然会很奇怪,因为String是一个CharSequence,但我不知道方法匹配是如何完成的)

标签: android android-widget


【解决方案1】:

感谢 njzk2,我找到了解决方案。这是一个相当愚蠢的问题。 我需要调用 RemoteViews#setCharSequence 而不是 setString,然后一切正常!

【讨论】:

    【解决方案2】:

    我知道这个问题几个月前就有人问过了,但我认为你自己的答案实际上是错误的。

    如 API 指南中所述,appwidget 上允许的唯一类是:

    AnalogClock
    Button
    Chronometer
    ImageButton
    ImageView
    ProgressBar
    TextView
    ViewFlipper
    ListView
    GridView
    StackView
    AdapterViewFlipper
    

    因此,您需要一个能够在屏幕打开时每秒、每分钟或每小时更新小部件的 alarmManager,具体取决于您的需要。

    更新小部件时,您必须将 textview 的文本更改为实际时间。您可以将这个时间格式化如下:

    RemoteViews views = new RemoteViews(context.getPackageName(), viewID);
    Calendar c = Calendar.getInstance();
    SimpleDateFormat timeFormat24 = new SimpleDateFormat("kk:mm");
    String time24 = timeFormat24.format(c.getTime());
    views.setTextViewText(R.id.textClock, time24);
    

    See this link for more information on the formatting.

    【讨论】:

    • 虽然您是正确的,文档没有将 TextClock (developer.android.com/guide/topics/appwidgets/index.html) 列为应用程序小部件内的可能小部件,但它确实是可能的。这可以通过尝试或验证 @RemoteView 注释是否存在于 grepcode.com/file/repository.grepcode.com/java/ext/… 中来验证。
    • @PatrickHuy 哇……太棒了!您有关于 TextClock 电池使用情况的任何信息吗?在 AppWidget 中是否唤醒手机?
    • 我没有硬数字,但电池使用情况比手动更新文本字段要好,因为您不需要运行服务。 TextClock 侦听 ACTION_TIME_TICK 意图。普通的应用小部件无法正确执行此操作。 ACTION_TIME_TICK 不会唤醒手机(请参阅 stackoverflow.com/questions/3274583/… )我已经使用 TextClock 创建了这个应用程序:play.google.com/store/apps/details?id=cc.frz.circleclock 但是它还使用了一项服务来更新图形,这对电池来说不是很好,但可能还可以。
    • @PatrickHuy 非常感谢您提供的有用帮助!我在我的小部件中包含了两个文本时钟(一个用于时间,一个用于日期),并从大约 24 小时后将其放置在我的主屏幕中。它甚至没有显示在我的手机设置的电池统计信息中,这足以让我接受它是完全成功的!再次,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2021-09-16
    • 2016-05-16
    • 1970-01-01
    相关资源
    最近更新 更多