2017-02-08 1 views
2

J'ai essayé pendant des heures de faire fonctionner les polices personnalisées dans mon projet MvvmCross, en particulier la plate-forme Android. J'ai réussi à installer le composant et j'ai suivi les étapes mentionnées: https://components.xamarin.com/gettingstarted/calligraphyxamarinCallygraphyXamarin ne fonctionne pas dans MvxAppCompatActivity

Il ne veut tout simplement pas fonctionner.

Je l'ai testé sur une activité que hérite de Activity et AppCompatActivity ils fonctionnent tous les deux correctement. On dirait que l'héritage de MvxAppCompatActivity le brise? Des solutions à ce problème?

Répondre

7

Mise à jour

Je sorti un paquet NuGet pour cela (voir MvvmCross.Calligraphy).

Il suffit de le télécharger et de modifier votre configuration comme:

public class Setup : MvxAndroidSetup 
{ 
    protected override MvxAndroidBindingBuilder CreateBindingBuilder() 
    { 
     return new CalligraphyMvxAndroidBindingBuilder(); 
    } 
} 

Oui, parce que MvvmCross utilise une mise en page personnalisée gonfleur d'apporter dans les fixations et certains d'autres trucs magiques. Cela déclenche le gonfleur de calligraphie. Malheureusement, je n'ai pas trouvé de moyen d'utiliser le composant nuget package/xamarin. Vous devez créer une liaison propre et rendre CalligraphyFactory disponible.

modifié metadata.xml

<attr path="/api/package[@name='uk.co.chrisjenx.calligraphy']/class[@name='CalligraphyFactory']" 
     name="visibility">public</attr> 

usine personnalisée

public class MyFactory : MvxAndroidViewFactory 
{ 
    private CalligraphyFactory _factory; 

    public MyFactory() 
    { 
     _factory = new Calligraphy.CalligraphyFactory(Resource.Attribute.fontPath); 
    } 

    public override View CreateView(View parent, string name, Context context, IAttributeSet attrs) 
    { 
     var view = base.CreateView(parent, name, context, attrs); 
     view = _factory.OnViewCreated(view, context, attrs); 
     return view; 
    } 
} 

contructeurs liaison

class MyBindingBuilder : MvxAndroidBindingBuilder 
{ 
    protected override IMvxAndroidViewFactory CreateAndroidViewFactory() 
    { 
     return new MyFactory(); 
    } 
} 

Setup.cs

public class Setup : MvxAndroidSetup 
{ 
    protected override MvxAndroidBindingBuilder CreateBindingBuilder() 
    { 
     return new MyBindingBuilder(); 
    } 
    // ... 
} 

Activité

Vous n'avez pas besoin AttachBaseContext. Malheureusement, il semble ne pas fonctionner avec MvxAppCompatActivity, mais avec MvxActivity. Je ne suis pas sûr de ce qui cause ce problème, pour le moment.

public class FirstView : MvxActivity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     CalligraphyConfig.InitDefault(new CalligraphyConfig.Builder() 
      .SetDefaultFontPath("fonts/gtw.ttf") 
      .SetFontAttrId(Resource.Attribute.fontPath) 
      .DisablePrivateFactoryInjection() 
      .Build()); 

     SetContentView(Resource.Layout.FirstView); 
    } 
} 

Voir

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <EditText 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="40dp" 
    local:MvxBind="Text Hello" 
    /> 
    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="40dp" 
    local:MvxBind="Text Hello" 
    fontPath="fonts/gtw.ttf" 
    /> 
</LinearLayout> 

Résultat

custom font

+0

Grand merci pour votre réponse !! Cela fonctionnera également avec les styles? Avez-vous tous les boutons, etc. avec la même police? – cfl

+0

@cfl Voir ma mise à jour en haut de la réponse. Cette solution fonctionne avec 'MvxActivity' et' MvxAppCompatActivity'. –

+0

Merci pour votre paquet génial !!! Aller à l'essayer dès que possible – cfl

2

avec la calligraphie et MvvmCross ensemble est surpuissant, car MvvmCross utilise une mise en page personnalisée gonfleur pour apporter les fixations que vous pouvez lier facilement des polices personnalisées à TextView police de caractères par un convertisseur personnalisé.

public class StringToFontConverter : MvxValueConverter<string, Typeface> 
{ 
    private static readonly Dictionary<string, Typeface> Cache = new Dictionary<string, Typeface>(); 

    protected override Typeface Convert(string fontName, Type targetType, object parameter, CultureInfo culture) { 
     try { 
      if (!fontName.StartsWith(@"fonts/")) fontName = @"fonts/" + fontName; 
      if (!fontName.EndsWith(".ttf")) fontName += ".ttf"; 

      if (!Cache.ContainsKey(fontName)) 
       Cache[fontName] = Typeface.CreateFromAsset(Application.Context.Assets, fontName); 

      return Cache[fontName]; 
     } catch { 
      return Typeface.Default; 
     } 
    } 
} 

et l'utiliser dans la mise en page:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    local:MvxBind="Typeface StringToFont('Roboto-Light')"/> 

Ou dans des styles:

<style name="CustomTextViewStyle" parent="@android:style/Widget.TextView"> 
    <item name="MvxBind">"Typeface StringToFont('Roboto-Regular')"</item> 
</style> 

bibliothèque de calligraphie fait le même travail, processus gonflez override mise en page et changer caractères TextView, il est donc indésirable pour ajouter la prochaine bibliothèque et augmenter le poids d'apk.