android - mvvmcross videoview URL 绑定(bind)

标签 android xamarin cross-platform mvvmcross

我是 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/

相关文章:

屏幕关闭时 Android Wakelock 不工作

c# - 使 ImageView 循环

c# - 如何在 C# 中使用带有 Xamarin 或 Dot42 的 async/await 实现 Android 回调?

python - 导入模块时的错误处理

c++ - 跨平台绘图库

android - Cocos2d-x跨平台游戏开发

java - 仅从输入中获取数字并调用该号码 Android

android - 在android中使用 Intent 打电话

android - 无法在 ubuntu 13.04 中显示 android 设备

sqlite - Xamarin Crash on iOS only on SQLite update call for model