Android Wear:将变量从数据对象传递到watch face服务

时间:2014-12-28 06:08:33

标签: android wear-os

我在手持式应用程序中发现了数据,我调用了数据更改:

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        Log.d(TAG, "Data changed: " + dataEvents);
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_DELETED) {
                Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
            } else if (event.getType() == DataEvent.TYPE_CHANGED) {
                Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
                if (event.getDataItem().getUri().getPath().endsWith(Data.PATH_SPEED)) {
                    DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                    // This is where I get the data for speedReport from the DataMap
                    String speedReport = dataMapItem.getDataMap().getString(Data.SPEED_REPORT);
                }
            }
        } 
    };

我试图让speedReport以这种格式转移到onDraw:

    @Override
    public void onDraw(Canvas canvas, Rect bounds) {
        canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);
        float x = mXOffset;

        // This is where I want to pass the variable for speedReport from the DataMap
        if (speedReport != null) {
            canvas.drawText(speedReport, x - 80, (mYOffset + 14), mAmPmPaint);
        } else {
            canvas.drawText("Loading Data", x - 80, (mYOffset + 14), mAmPmPaint);
        }
    }

当我使用活动进行此操作时(例如,对于常规磨损应用,而不是表面),我只使用了setText并将其应用到相应的textview。但事实证明这比这更复杂。它不是完全接受变量。我需要通过某种机制传递它。也许是处理程序或其他什么?

将数据从DataMap传输到onDraw的最佳方法是什么?你能提供一个例子作为指南吗?

更新 正如我在下面提到的,我尝试将speedReport设置为null,但是每次执行此操作时,speedReport基本上都会为null,即使有数据进入DataMap对象也是如此。

我注意到如果我将相同的speedReport变量设置为“null”到“33”,它会将“33”拉到onDraw。因此,定义局部变量是有效的,它只是没有从数据对象中获取该值。

我添加了一个日志: Log.d(TAG,“DataItem String:”+ speedReport);

后面的行:String speedReport = dataMapItem.getDataMap()。getString(Data.SPEED_REPORT);

日志报告我从手持设备预期的任何变量,表明数据正在传递到可穿戴应用程序并存储在数据对象中。但是数据并没有超出onDataChanged。

本着帮助其他人解决这个问题的精神,我确实有一个可以分享的临时解决方案。我将数据保存到共享首选项,然后从onDraw中退出共享首选项。这在技术上有效,但我的问题仍然存在,将数据从DataMap传输到onDraw的最佳方法是什么?你能提供一个例子作为指导吗?

1 个答案:

答案 0 :(得分:0)

您似乎正在使用CanvasWatchFace,所以您应该做的是:

  1. 创建speedReport字段并将其设置为null
  2. 当您使用新的onDataChanged收到DataMap回调时,请设置speedReport并致电invalidate()
  3. in onDraw' check if speedReport is null ; if yes, use"正在加载数据"字符串,否则使用speedReport value
  4. TextView之前有一个字段,其中包含speedReport的值或您的默认文本。现在你需要创建自己的字段来保存它。