MVVMCross ViewTyPeresolverはタグを解決しない(フラグメントまたはカスタムタイプ)
-
12-12-2019 - |
質問
実際の状況は、MvxViewTypeResolver
クラスに "Fragment" -caseに追加したので、このように見えます。
#region Copyright
// <copyright file="MvxViewTypeResolver.cs" company="Cirrious">
// (c) Copyright Cirrious. http://www.cirrious.com
// This source is subject to the Microsoft Public License (Ms-PL)
// Please see license.txt on http://opensource.org/licenses/ms-pl.html
// All other rights reserved.
// </copyright>
//
// Project Lead - Stuart Lodge, Cirrious. http://www.cirrious.com
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.Views;
using Cirrious.MvvmCross.Binding.Android.Interfaces.Binders;
namespace Cirrious.MvvmCross.Binding.Android.Binders
{
public class MvxViewTypeResolver : IMvxViewTypeResolver
{
private Dictionary<string, Type> _cache = new Dictionary<string, Type>();
public IDictionary<string, string> ViewNamespaceAbbreviations { get; set; }
#region IMvxViewTypeResolver Members
public virtual Type Resolve(string tagName)
{
Type toReturn;
if (_cache.TryGetValue(tagName, out toReturn))
return toReturn;
var unabbreviatedTagName = UnabbreviateTagName(tagName);
var longLowerCaseName = GetLookupName(unabbreviatedTagName);
var viewType = typeof(View);
#warning AppDomain.CurrentDomain.GetAssemblies is only the loaded assemblies - so we might miss controls if not already loaded
var query = from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where viewType.IsAssignableFrom(type)
where (type.FullName ?? "-").ToLowerInvariant() == longLowerCaseName
select type;
toReturn = query.FirstOrDefault();
_cache[tagName] = toReturn;
return toReturn;
}
private string UnabbreviateTagName(string tagName)
{
var filteredTagName = tagName;
if (ViewNamespaceAbbreviations != null)
{
var split = tagName.Split(new char[] {'.'}, 2, StringSplitOptions.RemoveEmptyEntries);
if (split.Length == 2)
{
var abbreviate = split[0];
string fullName;
if (ViewNamespaceAbbreviations.TryGetValue(abbreviate, out fullName))
{
filteredTagName = fullName + "." + split[1];
}
}
}
return filteredTagName;
}
#endregion
protected string GetLookupName(string tagName)
{
var nameBuilder = new StringBuilder();
switch (tagName)
{
case "View":
case "ViewGroup":
nameBuilder.Append("android.view.");
break;
case "fragment":
nameBuilder.Append("android.app.");
break;
default:
if (!IsFullyQualified(tagName))
nameBuilder.Append("android.widget.");
break;
}
nameBuilder.Append(tagName);
return nameBuilder.ToString().ToLowerInvariant();
}
private static bool IsFullyQualified(string tagName)
{
return tagName.Contains(".");
}
}
}
.
今度は正しいlongLowerCaseTagName
(Android.app.Fragment)を送信していますが、クエリではタイプを解決できません。
マイ勧告は、タイプの解決時にフラグメントコントロールがロードされないことです。分解されたタイプを得るための他の方法があるかもしれませんか?
カスタムタイプを追加した場合(AXMLのタグMvx.MyCustomType
を与える)は解決されません。この場合、MvxBindingAttributes.xml
に何かを追加する必要がありますか?
助けてくれてありがとう!
解決
最初にコードの説明:
MVVMCROSSバインダーによって使用されるカスタムXMLインフレータファクトリーは、標準2.x Android XMLインフルォーと非常に同様の方法でビューをロードしようとします。
ビュータイプの解決のデフォルトコードは実際には次のようになります。 https://github.com/slodge/mvvmcross/blob/master/cirrious/cirrious.mvvmcross.binding/android/binders/mvxviewtyperesolver.cs
XMLに<MyCompany.MyProject.MyViews.MyFirstView />
などの名前が含まれている場合は、ビュータイプリゾルバ:
-
略語をチェックし、これらを完全な名前空間に展開します - デフォルトでは、唯一の既知の省略形は
Mvx.
です。より多くの省略形を追加したい場合は、 https://github.com/slodge/mvvmcross/blob/master/cirrious/cirrious.mvvmcross.binding/android/mvxbaseAndeanDroidBindingSetup.cs -
は、未割り当て名が名前をない名前であるかどうかを確認します。もしそうであれば、クラスはAndroidネームスペースであり、
Cirrious.MvvmCross.Binding.Android.Views.
またはViewNamespaceAbbreviations
でそれを前に付けると仮定します。
-
は、大文字と小文字を区別しないルックアップキー
として、全Namespared Nameをすべて小文字に変換します。
-
その小文字を使用して、すべてのロードされたアセンブリのビューから派生するすべての型を検索します。
-
後続のインフレーションをスピードアップするために結果(ヌルかどうか)をキャッシュします。
その邪魔にならない説明 - これはあなたの質問に対する答えです:
mvvmcrossは現在フラグメントサポートをまだ含んでいません。公式のモノドロイドフラグメントサポート自体は先週だけリリースされていましたが、私はまだ誰かのリクエストフラグメントを要求していませんでした - Androidの「断片化」は、アクティビティとダイアログベースのコードにほとんどの人に保たれたようです。
ドキュメントでOOOOOKENGE android.view.
はAndroidビューではありません - java.lang.Objectから直接継承するように見えます - http://developer.android.com/reference/android /app/fragment.html "rel=" nofollow "> http://developer.android.com/reference/android/app/fragment.html
これにより、MVVMCRoss VioupTyPeroSolverが現在フラグメントで動作する方法はありません。
今日のmvvmcrossと断片の両方が必要な場合は、あなたの最善の賭けは(IOCを使用)あなた自身のレゾルバとのデフォルトのリゾルバを置き換えることですが、私はそうでないようにこれについて多くのアドバイスを提供することはできません。まだ完全に完全に読み、 http://developer.android.com/ガイド/トピック/基礎/ fragments.html
現在のインフレコードを作成する際の私の経験から、あなたがこれを行うときあなたはソースの必須読書を見つけると思います - 参照://gref="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/view/layoutinflater.javaiewfromtag. %28ANDROID.LANVE.String%2CJAVA.LANG.String%2CANDROID.UTIL.ATTRIBUSTESET%29 "REL=" NOFOLLOW "> http://grepcode.com/file/repository.grepcode.com/java/ext/com.google .android / Android / 4.0.1_R1 / Android / View / LayoutInFlater.java#layoutInFlater.CreateViewFromTag%28android.view.view%2cjava.lang.string%2candroid.util.AttributeSet%29
公式のMVVMCRossフラグメントサポートが利用可能になるときには、あなたに情報を与えることはできません - 現在スケジュールされているものではありません。
カスタムビューがサポートされていますが、通常はandroid.widget.
省略形名スペースには住んでいません。
UIアプリケーションの名前空間、または一部の共有ライブラリには住む可能性が高くなります。
アクションのカスタムビューを表示するには、チュートリアルのPulttoreFreshの例を参照してください - https://github.com/slodge/mvvmcross/blodge/mvvmcross/blob/master/Sample%20-%20tutorial/tutorial/tutorial.ui.droid/リソース/レイアウト/ PAGE_PULLTOREFRESHVIEW.AXML