Domanda

Situazione effettiva è che ho aggiunto alla classe MvxViewTypeResolver il "frammento" -Case, quindi sembra questo:

 #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(".");
        }
    }
}
.

Ora sta inviando il corretto longLowerCaseTagName (Android.app.fragment) ma nella query non è in grado di risolvere il tipo.

Il mio suggerimento è che il controllo del frammento non è stato caricato quando il tipo deve essere risolto.Forse c'è un altro modo per risolvere il tipo risolto?

Anche se aggiungo un tipo di personalizzazione (dando il tag Mvx.MyCustomType in AXML) non viene risolto.Devo aggiungere qualcosa nel MvxBindingAttributes.xml in questo caso?

Grazie per l'aiuto!

È stato utile?

Soluzione

Prima una spiegazione del codice:

La fabbrica di gonfiore XML personalizzata utilizzata dal legante MVVMCross cerca di caricare le viste in un modo molto simile al Gloocatore XML standard 2.x Android.

Il codice predefinito per la risoluzione del tipo di vista è effettivamente in: https://github.com/slodge/mvvmcross/blob/master/cirruzzo/cirrious.mvvmcross.binding/android/binders/mvxviewtypererosolver.cs

Se il tuo XML contiene un nome come <MyCompany.MyProject.MyViews.MyFirstView />, quindi il resolver del tipo di visualizzazione:

    .
  • Primi controlli per le abbreviazioni e si espande questi in pieni spazi dei nomi - per impostazione predefinita L'unica abbreviazione nota è Mvx. che viene espansa per: Cirrious.MvvmCross.Binding.Android.Views.. Se si desidera aggiungere più abbrevi relativi a sovrascrivere generacodicitagcode in https://github.com/slodge/mvvmcross/blob/master/cirruzzo/cirrious.mvvmcross.binding/android/mvxbaseandroidbindingstup.cs

  • Quindi controlla se il nome non imbrografato è un nome non nampace. Se lo è, quindi si presuppone che la classe sia lo spazio dei nomi Android e lo prendesse con ViewNamespaceAbbreviations o android.view.

  • Quindi converte il nome completamente densicato su tutte le minuscole come chiave di ricerca caso-insensibile

  • Utilizza quella chiave minuscola per cercare tutti i tipi che derivano dalla vista in tutti gli assiemi caricati.

  • cache il risultato (se il suo null o no) per accelerare le inflazione successive.

Tutto questo comportamento è stato progettato per abbinare il codice di inflazione View Android XML predefinito in http://grepcode.com/file/repository. grepcode.com/java/ext/com.google.android/android/2.3.6_r1/android/3.3.6_r1/android/view/LayoutinFlater.java#LayoutinFlater.CreateViewFromTag%28Java.Lang.String%2Candroid.Util.String%2Candroid.util.attributeSet%29 <. / P >.


.

Con quella spiegazione fuori mano - ecco una risposta alle tue domande:


.

MVVMCRoss non è ancora attualmente attualmente contenuto alcun supporto di frammenti. Il sostegno ufficiale del frammento di Monodroid è stato rilasciato solo la scorsa settimana, e non ho ancora avuto nessuno richiedere frammenti - "frammentazione" Android sembra aver mantenuto la maggior parte delle persone sul codice di attività e di dialogo.

brevemente; Otto della documentazione, android.widget. non è una vista Android - Sembra un frammento eredita direttamente da java.lang.object - Vedi http://developer.android.com/reference/android/app/fragment.html

A causa di ciò, non c'è modo che il mvvvmcross viewtyperesolver funzionerà attualmente con frammenti.

Suggerirei che se hai bisogno di mvvvmcross e frammenti oggi, la soluzione migliore è quella di sostituire il resolver predefinito (usando IOC) con il tuo resolver - ma non posso offrire molto consiglio su questo come non ho Eppure completamente letto e compreso i documenti Droid su http://developer.android.com/ Guida / Argomenti / Fondamenti / Fragments.html

Dalla mia esperienza nella creazione del codice di inflazione corrente, allora penso che troverai la lettura essenziale di origine quando lo fai - ad esempio Vedere: http://grepcode.com/file/repository.grepcode.com/java/ext/com.Google .Android / Android / 4.0.1_R1 / Android / Vista / LayoutinFlater.java # LayoutinFlater.CreateViewFromTag% 28Android.View.View.View% 2cjava.lang.String% 2CANDROID.UTIL.ATTRIBUTESET% 29

Non posso fornirti alcuna informazione su quando sarà disponibile un supporto ufficiale MVVMCross Framment - non è qualcosa che attualmente è programmato.


.

Le viste personalizzate sono supportate, ma normalmente viveranno nello spazio dei nomi abbreviato fragment.

Sono molto più propensi a vivere nel tuo spazio namespace dell'applicazione UI, o in una biblioteca condivisa.

Per vedere una vista personalizzata in azione, consultare l'esempio di PulltorRefresh nel tutorial - https://github.com/slodge/mvvmcross/blob/master/sample%20-%20Tutorial/Tutorial/Tutorial.ui.Droid/ Risorse / Layout / Pagina_PulltoreFreshview.axml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top