我想在我的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 void中更改UI中的文本。
也许这个问题有更好的解决方案,例如:
使呼叫表单平台依赖服务类实现为PCL或在PCL中进行诸如侦听器之类的操作
在PCL make计时器中,它对依赖项服务做出响应并例如每秒获取stepcounter值
忘记Xamarin.Forms并迁移到Xamarin.Native
最佳答案
我在您的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;
});