2015-09-23 225 views
1

我需要爲我的應用中的不同標籤指定不同的FontFamily。我需要使用默認字體(例如Roboto for Android和Helvetica for iOS)及其修改(例如Light,Medium,Bold)。據我瞭解,我應該使用Roboto-Light和Helvetica-Light來獲得Light版本的字體(對於Medium和Bold來說也是一樣)。 除了這個要求,我需要設置字體在XAML(如described in documentation),所以我結束了這段代碼XAMARIN:跨平臺FontFamily

<StackLayout BackgroundColor="#F8F8F8" Padding="0, 20, 0, 0"> 
<Label Text="Black" TextColor="#000000" > 
    <Label.FontSize> 
    <OnPlatform x:TypeArguments="x:Double" 
       iOS="17" 
       Android="16" 
       WinPhone="16" /> 
    </Label.FontSize> 
    <Label.FontFamily> 
    <OnPlatform x:TypeArguments="x:String"> 
     <OnPlatform.iOS>Helvetica-Black</OnPlatform.iOS> 
     <OnPlatform.Android>Roboto-Black</OnPlatform.Android> 
     <OnPlatform.WinPhone></OnPlatform.WinPhone> 
    </OnPlatform> 
    </Label.FontFamily> 
</Label> 
<Label Text="Light" TextColor="#000000"> 
    <Label.FontSize> 
    <OnPlatform x:TypeArguments="x:Double" 
       iOS="17" 
       Android="16" 
       WinPhone="16" /> 
    </Label.FontSize> 
    <Label.FontFamily> 
    <OnPlatform x:TypeArguments="x:String"> 
     <OnPlatform.iOS>Helvetica-Light</OnPlatform.iOS> 
     <OnPlatform.Android>Roboto-Light</OnPlatform.Android> 
     <OnPlatform.WinPhone></OnPlatform.WinPhone> 
    </OnPlatform> 
    </Label.FontFamily> 
</Label> 
<Label Text="Medium" TextColor="#000000" > 
    <Label.FontSize> 
    <OnPlatform x:TypeArguments="x:Double" 
       iOS="17" 
       Android="16" 
       WinPhone="16" /> 
    </Label.FontSize> 
    <Label.FontFamily> 
    <OnPlatform x:TypeArguments="x:String"> 
     <OnPlatform.iOS>Helvetica-Medium</OnPlatform.iOS> 
     <OnPlatform.Android>Roboto-Medium</OnPlatform.Android> 
     <OnPlatform.WinPhone></OnPlatform.WinPhone> 
    </OnPlatform> 
    </Label.FontFamily> 
</Label> 
<Label Text="Bold" TextColor="#000000"> 
    <Label.FontSize> 
    <OnPlatform x:TypeArguments="x:Double" 
       iOS="17" 
       Android="16" 
       WinPhone="16" /> 
    </Label.FontSize> 
    <Label.FontFamily> 
    <OnPlatform x:TypeArguments="x:String"> 
     <OnPlatform.iOS>Helvetica-Bold</OnPlatform.iOS> 
     <OnPlatform.Android>Roboto-Bold</OnPlatform.Android> 
     <OnPlatform.WinPhone></OnPlatform.WinPhone> 
    </OnPlatform> 
    </Label.FontFamily> 
</Label> 

然而,結果Android是意想不到的。不同標籤的FontFamily不會更改。他們都看起來一樣。

Android

iOS中相同的代碼工作預期

enter image description here

我的問題是:如何獲得的Roboto光強的Roboto介質的Roboto粗體字體在我的Android應用程序中,如果下面的XAMARIN文檔不起作用?

回答

4

更新:

我沒有看到你使用API​​ 18/4.3的第一次(在你的仿真器的標題欄),以爲你裝爲自定義資產較舊的Android版本。由於的Roboto是因爲4.1的默認字體,可以使用它們作爲:

  • 無襯線
  • 無襯線光
  • 無襯線冷凝
  • 無襯線薄(4.2 +)

原件:

https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/fonts/

Xamarin.Forms for Android目前無法將字體設置爲 以自定義字體文件,因此需要自定義渲染器。 在爲Android平臺編寫渲染器時,請創建一個字體 實例,該實例引用已添加到應用程序的Assets目錄(使用Build Action:AndroidAsset)的自定義字體文件。

[assembly: ExportRenderer (typeof (MyLabel), typeof (MyLabelRenderer))] 
namespace WorkingWithFonts.Android { 
    public class MyLabelRenderer : LabelRenderer { 
     protected override void OnElementChanged (ElementChangedEventArgs<Label> e) { 
      base.OnElementChanged (e); 
      var label = (TextView)Control; // for example 
      Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "SF Hollywood Hills.ttf"); 
      label.Typeface = font; 
     } 
    } 
} 
+0

感謝您注意到sans-serif字體家族實際上使用了自Android 4.1以來的Roboto字體。 我只有一個除了你的答案。請注意,不像helvetika-bold,沒有sans-serif-bold(或類似的)字體。爲了將字體設置爲粗體,我將Label.FontAttributes屬性設置爲粗體。這實現了我的要求。或者至少在設計師看看應用程序之前實現它們:) –

+0

第一個答案[here](http://stackoverflow.com/questions/12128331/how-to-change-fontfamily-of-textview-in- android)也證實了這一說法。 –

+0

@SushiHangover - 您上面張貼的鏈接現在表示自定義字體現在可在Android上使用。不過,儘管遵循了文章中的步驟,但我並未在Android上看到我的自定義字體。你知道自定義字體實際上是否仍然不支持Android? –

1

我做覆蓋,因爲我需要它爲所有視圖的默認渲染。

這樣,像你這樣的打算,你可以使用XAML代碼:

<Label FontFamily="Arial" Text="Hi there" /> 

下面是標籤的例子。

[assembly: ExportRenderer (typeof (Label), typeof (MyLabelRenderer))] 
namespace MyApp.Droid 
{ 
    public class MyLabelRenderer : LabelRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
     { 
      base.OnElementChanged(e); 

      if (!String.IsNullOrEmpty(Element.FontFamily)) 
       Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily + ".otf"); 
     } 
    } 
} 

當然,您需要將它映射到您嵌入自定義字體的位置。在我的情況下,Assets/Fonts/Arial.otf

0

請使用以下渲染,加載自定義字體的標籤,請確保你把你的字體文件中的字體文件夾中的Android項目的資產文件夾中定義的所有平臺

[assembly: ExportRenderer(typeof(Label), typeof(CustomLabelRenderer))] 
namespace MyApp.Droid.Renderer 
{ 
    public class CustomLabelRenderer : LabelRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
     { 
      base.OnElementChanged(e); 
      if (e.NewElement != null) 
       if (!String.IsNullOrEmpty(e.NewElement.FontFamily)) 
        Control.Typeface = Typeface.CreateFromAsset(Forms.Context.Assets, "Fonts/" + Element.FontFamily); 
     } 
    } 
} 

XAML相似的路徑請確保字體文件在字體文件夾中可用

<Label FontFamily="Roboto-Light.ttf" Text="Hi there" />