Est-il possible de définir la police pour tous les TextViews d'une activité? Je peux définir la police pour un seul textView en utilisant:
TextView tv=(TextView)findViewById(R.id.textView1);
Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf");
tv.setTypeface(face);
Mais je voudrais changer tous les textViews à la fois, au lieu de le définir manuellement pour chaque textView, toute information serait appréciée!
Solution1 :: Appelez simplement ces méthodes en passant l'argument parent.
private void overrideFonts(final Context context, final View v) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else if (v instanceof TextView ) {
((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "font.ttf"));
}
} catch (Exception e) {
}
}
Solution2 :: vous pouvez sous-classer la classe TextView avec votre police personnalisée et l'utiliser à la place de textview.
public class MyTextView extends TextView {
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyTextView(Context context) {
super(context);
init();
}
private void init() {
if (!isInEditMode()) {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font.ttf");
setTypeface(tf);
}
}
}
Celui de ma collection personnelle:
private void setFontForContainer(ViewGroup contentLayout) {
for (int i=0; i < contentLayout.getChildCount(); i++) {
View view = contentLayout.getChildAt(i);
if (view instanceof TextView)
((TextView)view).setTypeface(yourFont);
else if (view instanceof ViewGroup)
setFontForContainer((ViewGroup) view);
}
}
Si vous recherchez une solution de programmation plus générale, j'ai créé une classe statique qui peut être utilisée pour définir la police de caractères d'une vue complète (interface utilisateur d'activité). Notez que je travaille avec Mono (C #) mais que vous pouvez l’implémenter facilement avec Java.
Vous pouvez transmettre à cette classe une mise en page ou une vue spécifique que vous souhaitez personnaliser. Si vous voulez être super efficace, vous pouvez l'implémenter en utilisant le modèle Singleton.
public static class AndroidTypefaceUtility
{
static AndroidTypefaceUtility()
{
}
//Refer to the code block beneath this one, to see how to create a typeface.
public static void SetTypefaceOfView(View view, Typeface customTypeface)
{
if (customTypeface != null && view != null)
{
try
{
if (view is TextView)
(view as TextView).Typeface = customTypeface;
else if (view is Button)
(view as Button).Typeface = customTypeface;
else if (view is EditText)
(view as EditText).Typeface = customTypeface;
else if (view is ViewGroup)
SetTypefaceOfViewGroup((view as ViewGroup), customTypeface);
else
Console.Error.WriteLine("AndroidTypefaceUtility: {0} is type of {1} and does not have a typeface property", view.Id, typeof(View));
}
catch (Exception ex)
{
Console.Error.WriteLine("AndroidTypefaceUtility threw:\n{0}\n{1}", ex.GetType(), ex.StackTrace);
throw ex;
}
}
else
{
Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / view parameter should not be null");
}
}
public static void SetTypefaceOfViewGroup(ViewGroup layout, Typeface customTypeface)
{
if (customTypeface != null && layout != null)
{
for (int i = 0; i < layout.ChildCount; i++)
{
SetTypefaceOfView(layout.GetChildAt(i), customTypeface);
}
}
else
{
Console.Error.WriteLine("AndroidTypefaceUtility: customTypeface / layout parameter should not be null");
}
}
}
Dans votre activité, vous devrez créer un objet Typeface. Je crée le mien dans OnCreate () en utilisant un fichier .ttf placé dans mon répertoire Resources/Assets /. Assurez-vous que le fichier est marqué en tant qu'actif Android dans ses propriétés.
protected override void OnCreate(Bundle bundle)
{
...
LinearLayout rootLayout = (LinearLayout)FindViewById<LinearLayout>(Resource.Id.signInView_LinearLayout);
Typeface allerTypeface = Typeface.CreateFromAsset(base.Assets,"Aller_Rg.ttf");
AndroidTypefaceUtility.SetTypefaceOfViewGroup(rootLayout, allerTypeface);
}
Prolonger la réponse d'Agarwal ... vous pouvez définir des styles normal, gras, italique, etc. en changeant le style de votre TextView.
import Android.content.Context;
import Android.graphics.Typeface;
import Android.util.AttributeSet;
import Android.widget.TextView;
public class TextViewAsap extends TextView {
public TextViewAsap(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public TextViewAsap(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextViewAsap(Context context) {
super(context);
init();
}
private void init() {
if (!isInEditMode()) {
Typeface tf = Typeface.DEFAULT;
switch (getTypeface().getStyle()) {
case Typeface.BOLD:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Bold.ttf");
break;
case Typeface.ITALIC:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
break;
case Typeface.BOLD_ITALIC:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Italic.ttf");
break;
default:
tf = Typeface.createFromAsset(getContext().getAssets(), "Fonts/Asap-Regular.ttf");
break;
}
setTypeface(tf);
}
}
}
Vous pouvez créer votre dossier Assets comme ceci:
Et votre dossier Assets devrait ressembler à ceci:
Enfin, votre TextView au format XML devrait être une vue de type TextViewAsap. Maintenant, il peut utiliser n'importe quel style que vous avez codé ...
<com.example.project.TextViewAsap
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Example Text"
Android:textStyle="bold"/>
Meilleures réponses
1. Définition de la police personnalisée pour un textView
Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "Fonts/FontName.ttf");
textView.setTypeface (typeface);
2. Définition de la police personnalisée pour tous les textViews
Créez une classe Java comme ci-dessous
public class CustomFont extends Android.support.v7.widget.AppCompatTextView {
public CustomFont(Context context) {
super(context);
init();
}
public CustomFont(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomFont(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/FontName.ttf");
setTypeface(tf);
}
}
Et dans votre page xml
<packageName.javaClassName>
...
/>
=>
<com.mahdi.hossaini.app1.CustomFont
Android:id="@+id/TextView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:text="KEEP IT SIMPLE"
Android:textAlignment="center" />
Vous pouvez utiliser la bibliothèque Calligraphy
qui est disponible ici:
Bibliothèque de calligraphie Android
** il présente une idée de la méthode setTextSize (int, float) impliquant les enfants du groupe de vue, mais vous pouvez l'adopter comme dans le cas de votre question à setTypeFace ()
/**
* change text size of view group children for given class
* @param v - view group ( for example Layout/widget)
* @param clazz - class to override ( for example EditText, TextView )
* @param newSize - new font size
*/
public static void overrideTextSize(final View v, Class<?> clazz, float newSize) {
try {
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideTextSize(child, clazz, newSize);
}
} else if (clazz.isAssignableFrom(v.getClass())) {
/** create array for params */
Class<?>[] paramTypes = new Class[2];
/** set param array */
paramTypes[0] = int.class; // unit
paramTypes[1] = float.class; // size
/** get method for given name and parameters list */
Method method = v.getClass().getMethod("setTextSize",paramTypes);
/** create array for arguments */
Object arglist[] = new Object[2];
/** set arguments array */
arglist[0] = TypedValue.COMPLEX_UNIT_SP;
arglist[1] = newSize;
/** invoke method with arguments */
method.invoke(v,arglist);
}
} catch (Exception e) {
e.printStackTrace();
}
}
MISE EN GARDE:
utiliser la réflexion doit être très prudent. Classe de réflexion c'est très " exceptionnel "