3

実際の状況は、MvxViewTypeResolver「フラグメント」ケースをクラスに追加したため、次のようになります。

 #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)を送信していますが、クエリではタイプを解決できません。

私の提案は、型を解決する必要があるときにフラグメントコントロールが読み込まれないことです。型を解決する別の方法があるのではないでしょうか?

また、カスタム タイプ ( Mvx.MyCustomTypeaxml でタグを指定) を追加しても、解決されません。MvxBindingAttributes.xmlこの場合、何かを追加する必要がありますか?

助けてくれてありがとう!

4

1 に答える 1

2

最初にコードの説明:

MvvmCross Binder で使用されるカスタム XML インフレータ ファクトリは、標準の 2.x Android XML インフレータと非常によく似た方法でビューを読み込もうとします。

ビュー タイプ解決のデフォルト コードは、実際には次のとおりです

xml に次のような名前が含まれている場合<MyCompany.MyProject.MyViews.MyFirstView />、ビュー タイプ リゾルバー:

  • 最初に略語をチェックし、これらを完全な名前空間に展開します。デフォルトでは、知られている唯一の略語は次のMvx.ように展開されます: Cirrious.MvvmCross.Binding.Android.Views.. さらに略語を追加する場合は、 https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/Android/MvxBaseAndroidBindingSetup.csViewNamespaceAbbreviationsでオーバーライドします。

  • 次に、省略されていない名前が名前空間のない名前かどうかを確認します。そうである場合、クラスが Android 名前空間であると想定し、先頭にandroid.view.orを追加します。android.widget.

  • 次に、大文字と小文字を区別しない検索キーとして、完全に名前空間が付けられた名前をすべて小文字に変換します

  • その小文字のキーを使用して、読み込まれたすべてのアセンブリで View から派生したすべての型を検索します。

  • その後のインフレーションを高速化するために、(null であるかどうかに関係なく) 結果をキャッシュします。

この動作はすべて、http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.6_r1/android/ のデフォルトの Android xml ビュー インフレーション コードと一致するように設計されています。 view/LayoutInflater.java#LayoutInflater.createViewFromTag%28java.lang.String%2Candroid.util.AttributeSet%29


その説明が邪魔にならないように-これがあなたの質問への答えです:


MvvmCross には現在、フラグメントのサポートはまだ含まれていません。公式の MonoDroid フラグメント サポート自体は先週リリースされたばかりで、まだフラグメントをリクエストした人はいません。Android の「フラグメント化」により、ほとんどの人がアクティビティとダイアログ ベースのコードに戻ってきたようです。

簡単に説明すると、ドキュメントをfragment見ると Android ビューではありません - Fragment は Java.Lang.Object から直接継承しているようです - http://developer.android.com/reference/android/app/Fragment.htmlを参照してください

このため、現在 MvvmCross ViewTypeResolver がフラグメントを処理する方法はありません。

現在、mvvmcross とフラグメントの両方が必要な場合は、デフォルトのリゾルバー (IoC を使用) を独自のリゾルバーに置き換えることをお勧めしますが、まだ完全に読んでいないため、これについてはあまりアドバイスできません。http://developer.android.com/guide/topics/fundamentals/fragments.htmlのドロイドドキュメントを理解しました

現在のインフレーションコードを作成した私の経験から、これを行うときにソースの重要な読み物が見つかると思います-たとえば、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 フラグメント サポートがいつ利用可能になるかについては、何も情報を提供できません。現在予定されているものではありません。


カスタム ビューはサポートされていますが、通常はMvx.省略された名前空間には存在しません。

これらは、UI アプリケーションの名前空間または共有ライブラリに存在する可能性が高くなります。

カスタム ビューの動作を確認するには、チュートリアルの PullToRefresh の例を参照してください - https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20Tutorial/Tutorial/Tutorial.UI.Droid/Resources/Layout /Page_PullToRefreshView.axml

于 2012-05-22T09:39:34.487 に答える