从依赖服务访问UI

时间:2016-06-17 07:14:28

标签: c# android xamarin xamarin.forms

我想在我的Xamarin.Forms项目中使用StepCounter 如果我已经正确理解,我需要使用Dependency Service,编写stepcounter的接口以及他在Android / IOS应用程序上的实现。

问题在于,当步进传感器状态发生变化时,我想每时刻更新ui控制(文本)。例如在Android中我们有

using Android.Hardware;
/*Dependency Service header 
[assembly: Dependency(typeof(.....
*/
...
namespace tmp
{
 public class Stepper : ISensorEventListener, INameOfDependencyInterface
 {
   public static void Init()
    {
    SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
         Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);

         if (counter != null)
         {
             senMgr.RegisterListener(this, counter, SensorDelay.Normal);
         }
    }
  public void OnSensorChanged(SensorEvent e)
    {
        /*something that change text on ui*/
    }
 }
}

在这里,正如您所看到的,我想在OnSensorChanged中更改UI中的文本。

也许这个问题有更好的解决方案,例如:

  1. 向PCL调用表单平台依赖服务类实现或在PCL中创建类似侦听器的东西

  2. 在PCL make timer中,响应依赖服务并获取stepcounter值,例如每秒

  3. 忘记Xamarin.Forms并迁移到Xamarin.Native

1 个答案:

答案 0 :(得分:1)

我在Action构造函数中添加了Init,当传感器发生变化时会调用它:

public class Stepper : ISensorEventListener, INameOfDependencyInterface
{

    private Action<float> _stepCountChanged;

    public static void Init(Action<float> stepCountChanged)
    {
        SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
        Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);

        if (counter != null)
        {
            senMgr.RegisterListener(this, counter, SensorDelay.Normal);
        }

        _stepCountChanged = stepCountChanged;
    }
    public void OnSensorChanged(SensorEvent e)
    {
        _stepCountChanged(e.Values.First());

    }
}

在你Activity中以这样的方式初始化它:

DependencyService.Get<...>().Init((steps) => { 
    // Label.Steps = steps;
});