MvvmCross Android ViewStub

时间:2016-03-22 13:24:09

标签: android xamarin mvvmcross

我最近发现了一个名为ViewStub的类,可用于“延迟加载”布局资源。用法非常简单:

在布局文件中我使用:

<ViewStub
    android:id="@+id/content_stub"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

在我的代码中:

var stub = this.FindViewById<ViewStub>(Resource.Id.content_stub);
stub.LayoutResource = Resource.Layout.FirstView;
stub.Inflate();

然而,这样Bindings将无法正常工作!我知道,使用mvvmcross我必须调用BindingInflate,但该方法不适用于ViewStub我查找了类似MvxViewStub的内容,但我找不到任何内容。

那么,有没有办法以某种方式获得与ViewStub的绑定工作?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

在浏览各种mvvmcross-sources后,我发现了一个似乎有效的解决方案。如果这就是应该如何做的话,我不会感到害羞,所以如果有人有更好的方法,请告诉我。

现在如何运作:

using (new MvxBindingContextStackRegistration<IMvxAndroidBindingContext>((IMvxAndroidBindingContext)this.BindingContext))
{
    var stub = this.FindViewById<ViewStub>(Resource.Id.content_stub);
    stub.LayoutInflater = this.LayoutInflater;
    stub.LayoutResource = Resource.Layout.FirstView;
    stub.Inflate();
}

答案 1 :(得分:0)

我必须做类似的事情,但差异足够大,以为我会发布一个单独的答案,以防它对任何人都有用。我有一个微调器,并根据该微调器中的选择显示不同的UI“块”。这利用了ViewStub第一次将Visibility设置为Visible时自动膨胀的能力。

根据上面的建议,我把它作为一种扩展方法:

public static void SetViewStubVisibilityAndInflate(this View view, MvxFragment fragment, ViewStates visibility)
{
    if (view is ViewStub && visibility == ViewStates.Visible)
    {
        var stub = (ViewStub)view;
        using (new MvxBindingContextStackRegistration<IMvxAndroidBindingContext>((IMvxAndroidBindingContext)fragment.BindingContext))
        {
            stub.LayoutInflater = fragment.Activity.LayoutInflater;
            stub.Inflate();
        }
    }

    view.Visibility = visibility;
}

这是我的UI中的代码(可能更干净......):

private void SetCurveInputsVisibility(View view)
{
    var std = view.FindViewById(Resource.Id.CurveTypeStandard);
    var stdVis = (ViewModel.Values.CurveType == ServoCurveType.Standard ? ViewStates.Visible : ViewStates.Gone);
    std.SetViewStubVisibilityAndInflate(this, stdVis);

    var expo = view.FindViewById(Resource.Id.CurveTypeExpo);
    var expoVis = (ViewModel.Values.CurveType == ServoCurveType.Exponential ? ViewStates.Visible : ViewStates.Gone);
    expo.SetViewStubVisibilityAndInflate(this, expoVis);

    var custom = view.FindViewById(Resource.Id.CurveTypeCustom);
    var customVis = (ViewModel.Values.CurveType == ServoCurveType.Custom ? ViewStates.Visible : ViewStates.Gone);
    custom.SetViewStubVisibilityAndInflate(this, customVis);
}