2016-06-04 8 views
0

Ich entwickle eine Android App. In meiner App verwende ich mehrere Sprachen. Völlig lokalisiere ich. Aber ich habe ein Problem damit. Derzeit unterstützt meine App zwei Sprachen. Aber mein Problem ist, ich möchte die Schriftart für alle TextView, EditText, Button und so weiter ändern, wenn der Benutzer die Sprache ändern. Bitte sehen Sie mein Szenario unten. DieseWie programmiere ich globale Schriftart für alle Ansichten in Android?

ist, wie ich Schrift setze programmatisch, wenn die Sprache ändern:

if(Language=="mm") 
{ 
    Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/tharlon.ttf"); 
    icBtnFindPlaces.setTypeface(tf); 
} 
else{ 
    Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/inconsolata.ttf"); 
    icBtnFindPlaces.setTypeface(tf); 
} 

Wie Sie sehen oben ich es mit dem Text für alle Ansichten zu tun haben. Das ist kein guter Weg. Warum ich will ist, ich möchte Schriftart global für alle Ansichten, nicht eins nach dem anderen festlegen. Ist es möglich?

+0

Ich vermute, Sie könnten die Standardsteuerelemente ('TextView' usw.) erweitern und sie auf Sprachänderungen warten lassen, dann die Schriftart aktualisieren. In diesem Q & A (http://stackoverflow.com/a/5754633/3372061) wird erläutert, wie ein Gebietsschemaänderungsereignis abgefangen wird. –

+0

Auch wenn ich Listener erstelle, muss ich ihn für jede Ansicht binden. Ich möchte das Schriftbild global nur einmal ändern. Ist das möglich? –

+0

Sie müssten dies für jeden 'View' ** Typ ** wiederholen, nicht für jeden' ​​View'. Hier ein Beispiel: Erweitern Sie die Klasse 'TextView' und fügen Sie einen Broadcast-Empfänger hinzu. Verwenden Sie dann den neuen Typ von' TextView' überall. Sie können auch eine 'statische' Hilfsklasse haben, die die Änderung der Schriftart der 'Ansicht' behandelt, die Sie übergeben. Ich habe das selbst nicht versucht, aber ich denke, es sollte funktionieren. –

Antwort

0
Hi here is a good example 

If there are many TextView's need to set external font then you have to create a your own custom TextView and set the font like as below, 

Add FontManager as a Singleton Java class 

public class FontManager { 
    public static Typeface light; 
    public static Typeface medium; 
    public static Typeface regular; 
    private static FontManager instance; 
    private AssetManager mgr; 

    private FontManager(AssetManager _mgr) { 
     this.mgr = _mgr; 
     lght = Typeface.createFromAsset(mgr,"---.ttf"); 
     medium = Typeface.createFromAsset(mgr,"---.ttf"); 
     regular = Typeface.createFromAsset(mgr,"---.ttf"); 
    } 

    public static FontManager init(AssetManager mgr) { 
     if(instance != null) 
      return instance; 
     return instance = new FontManager(mgr); 
    } 

    public static FontManager getInstance() { 
     return instance; 
    } 

    private String fixAssetFilename(String asset) { 
     // Empty font filename? 
     // Just return it. We can't help. 
     if (asset.length() == 0) 
      return asset; 

     return asset; 
    } 
} 


call it in your Splash Activity as 

FontManager.init(getApplicationContext().getAssets()); 


public class LightTextView extends TextView { 

    public LightTextView(Context context) { 
     super(context); 
    } 

    public LightTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     if(context.getString(R.string.lang).equals("en")) 
      setTypeface(FontManager.light); 
     else 
      setTypeface(FontManager.medium); 
    } 
} 


Add values --> string.xml 
<string name="lang">en</string> 

values-fr --> string.xml 
<string name="lang">fr</string> 

<com.exa.fonttest.LightTextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="16dp" 
    android:gravity="center" 
    android:textSize="20sp" 
    android:textColor="@color/white" 
    android:text="Good luck"/> 


While changing the locale automatically change the font. 

Good luck.