2016-03-22 15 views
1

Geçenlerde buldum "tembel yük" bir düzen-kaynak için kullanılabilir ViewStub adında bir sınıf. düzen dosyasındaMvvmCross Android ViewStub

kullandığım:

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

Ve benim kod: kullanımı çok basittir

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

Ancak bu şekilde Bağlar çalışmayacaktır! Biliyorum, bu mvvmcross kullanarak BindingInflate aramak zorunda, ancak bu yöntem ViewStub için uygun değil MvxViewStub gibi bir şey için aradım, ama bir şey bulamadık.

Yani, bir şekilde ViewStub ile bağlama işini almanın bir yolu var mı? Yardım ettiğin için teşekkür ederim.

cevap

2

çeşitli mvvmcross-kaynaklar aracılığıyla tarama sonra, iş gibi görünüyor bir çözüm buldu. Bu şekilde yapılmalı, eğer böyle yapılması gerekiyorsa, eğer birisi daha iyi bir yaklaşıma sahipse, lütfen bana söyleyin.

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

Meh. Cevabı neredeyse aynı kodla yazıyordum. Evet doğru yoldur :) Bunun için düzgün bir uzantı yöntemi yazmayı öneririm. –

0

Benzer bir şey yapmak zorunda kaldı, ama farklılıklar ben o herkes için yararlıdır durumunda ayrı yanıt sonrası düşünmüştüm sadece yeterince büyüktür:

şimdilik nasıl çalışır. Bir spikerim var ve bu spinnerdaki seçime dayanarak, farklı bir "yığın" UI'si görüntülenir. Bu, ViewStub'un Görünürlük öğesinin Görünür olarak ayarlandığı ilk kez otomatik olarak büyütme yeteneğinden yararlanır. Yukarıdaki öneri Başına

, bunu bir uzantısı yöntemi yaptı:

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; 
} 

Ve burada (... süpürge olabilir) benim arayüzünde kodu verilmiştir:

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); 
} 
İlgili konular