現在、MvvmCross は、アクティビティの場合と同様に、フラグメントの自動ナビゲーション メカニズムを提供していません。
ただし、ユース ケース内で、ナビゲーション アプローチを使用する場合は、同様のタイプの自動ルックアップ/ナビゲーション メカニズムを自動的に構築できます。
これを行うための最も簡単な開発者ルートは、リフレクションを使用してすべてのフラグメントのルックアップ ディクショナリを見つけることでしょう。
var fragments = from type in this.GetType().Assembly.GetTypes()
where typeof(IAnimalGroupView)..sAssignableFrom(type)
where type.Name.EndsWith("Fragment")
select type;
var lookup = fragments.ToDictionary(
x => x.Name.Substring(0, x.Name.Length - "Fragment".Length)
+ "ViewModel",
x => x);
これが整っていれば、必要なときにフラグメントを作成できます-たとえば
- ViewModel の ICommand を介して Selection イベントを
ShowViewModel<TViewModel>
呼び出しに変換するとします。
そして、これらの ShowViewModel リクエストをインターセプトしてアクティビティに渡すカスタム Mvx プレゼンターがあると仮定します (フラグメント サンプルに似ています) 。
public class CustomPresenter
: MvxAndroidViewPresenter
{
// how this gets set/cleared is up to you - possibly from `OnResume`/`OnPause` calls within your activities.
public IAnimalHostActivity AnimalHost { get; set; }
public override void Show(MvxViewModelRequest request)
{
if (AnimalHost != null && AnimalHost.Show(request))
return;
base.Show(request);
}
}
次に、アクティビティは次のShow
ようなものを使用して実装できます。
if (!lookup.ContainsKey(request.ViewModelType.Name))
return false;
var fragmentType = lookup[request.ViewModelType.Name];
var fragment = (IMvxFragmentView)Activator.Create(fragmentType);
fragment.LoadViewModelFrom(request);
var t = SupportFragmentManager.BeginTransaction();
t.Replace(Resource.Id.my_selected_fragment_holder, fragment);
t.Commit();
return true;
ノート:
- ここで使用していない場合は
ShowViewModel
、明らかにこの同じアプローチを調整できます...しかし、この答えは何かを提案する必要がありました...
IAnimalHostActivity
大規模な複数ページのアプリでは、おそらくこのメカニズムをより一般的なものにして、いくつかの場所で使用することを検討するでしょう。