【问题标题】:MvvmCross Android ViewStubMvvmCross Android ViewStub
【发布时间】:2016-04-08 23:47:20
【问题描述】:

我最近发现了一个名为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();

但是,这种方式绑定不起作用!我知道,使用 mvvmcross 我必须调用 BindingInflate,但该方法不适用于 ViewStub 我寻找类似 @​​987654326@ 的东西,但我找不到任何东西。

那么,有没有办法让 ViewStub 的绑定工作?感谢您的帮助。

【问题讨论】:

    标签: android xamarin mvvmcross


    【解决方案1】:

    在浏览了各种 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();
    }
    

    【讨论】:

    • 嗯。我正在用几乎相同的代码编写答案。是的,这是正确的方法 :) 我建议为它编写一个简洁的扩展方法。
    【解决方案2】:

    我不得不做类似的事情,但差异太大了,我想我会发布一个单独的答案,以防它对任何人有用。我有一个微调器,并根据该微调器中的选择显示不同的 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2020-09-25
      相关资源
      最近更新 更多