我是 MVVMCross 的新手,目前正在努力解决绑定(bind)问题。 尝试将视频的 URL 与 android 中的 VideoView 组件绑定(bind)。
- 是否有任何 Mvx.MvxBind 标签可以自动执行此操作?
- 否则,我如何将 URL 从 MvxViewModel 传递到 MvxActivity?
如果第一个选项不可行,我将尝试获取 URL 并按照此处的说明播放视频:http://developer.xamarin.com/recipes/android/media/video/play_video/
提前致谢。
最佳答案
MvvmCross 非常灵活。您要求的不是内置的东西,但您可以轻松扩展 MvvmCross 以添加对它的支持。
MvvmCross 有所谓的 Binding Builders。这是您注册自定义目标绑定(bind)的地方。绑定(bind)采用类型(如 VideoView)和属性名称(如“VideoUri”)。
当 MvvmCross 看到像这样的绑定(bind)属性时:local:MvxBind="VideoUri MyVideoUri"
它将从 MyVideoUri 中获取属性值,然后调用自定义绑定(bind),最终将调用 videoView.SetVideoURI()
。
这是您需要执行的步骤。
1) 在您的 Android 项目中,编辑 Setup.cs 并添加以下内容,以注册您的自定义绑定(bind)生成器。
protected override MvxAndroidBindingBuilder CreateBindingBuilder()
{
return new MyAndroidBindingBuilder();
}
2) 创建一个自定义绑定(bind)构建器,将默认的 Android 绑定(bind)构建器子类化:
public class MyAndroidBindingBuilder : MvxAndroidBindingBuilder
{
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
base.FillTargetFactories(registry);
registry.RegisterCustomBindingFactory<VideoView>("VideoUri",
videoView => new MvxVideoViewUriTargetBinding(videoView));
}
}
3) 为类型 VideoView 和属性“VideoUri”创建自定义目标绑定(bind):
public class MvxVideoViewUriTargetBinding : MvxAndroidTargetBinding
{
public MvxVideoViewUriTargetBinding(object target) : base(target)
{
}
public override Type TargetType
{
get { return typeof (string); }
}
protected override void SetValueImpl(object target, object value)
{
var videoView = (VideoView) target;
videoView.SetVideoURI(Uri.Parse((string)value));
}
}
要在您的布局中使用它,只需创建以下内容:
1) 在您的layout.xml
<VideoView
android:id="@+id/SampleVideoView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="VideoUri MyVideoUri" />
2) 在您的 ViewModel 中,为 MyVidoeUri 添加一个属性
public string MyVideoUri
{
get { return "http://ia600507.us.archive.org/25/items/Cartoontheater1930sAnd1950s1/PigsInAPolka1943.mp4"; }
}
3) 在您的 View 中,您可以像这样开始播放视频:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.MyLayout);
// SetVideoURI() already called via binding
var videoView = FindViewById<VideoView>(Resource.Id.SampleVideoView);
videoView.Start();
}
查看 MvxAndroidBindingBuilder 的源代码以查看当前绑定(bind)。 https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs
希望这对您有所帮助。
关于android - mvvmcross videoview URL 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27132621/