我最近发现了一个名为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的绑定工作?谢谢你的帮助。
答案 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);
}