如何在Android应用中设置自定义字体?

时间:2016-09-13 06:24:35

标签: android ios fonts

我想在我的应用中设置字体。

在IOS中,通过使用plist中的“应用程序提供的字体”选项,我可以在应用程序中设置字体。

但是我找不到在Android中设置的方法。

我不想应用整个应用程序,但想要应用我想要的一些活动。

有没有在Android中设置字体的选项? 谢谢。 (从现在开始,我在webview中使用了'WebFont'。但我想要的不是webFont,而是'设置字体')

感谢。

7 个答案:

答案 0 :(得分:0)

创建一个类似于此的应用程序类:

public class YourApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        TypeFaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/calibiri.ttf");
    }
}

创建Customer TypeFace类:

public class TypeFaceUtil {
   public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {

        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Map<String, Typeface> newMap = new HashMap<String, Typeface>();
            newMap.put("serif", customFontTypeface);
            try {
                final Field staticField = Typeface.class
                        .getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
                defaultFontTypefaceField.setAccessible(true);
                defaultFontTypefaceField.set(null, customFontTypeface);
            } catch (Exception e) {
                Log.e(TypeFaceUtil.class.getSimpleName(), "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
            }
        }
    }
}

Atlast下载ttf字体并将其放在资产文件夹中,如果您有任何疑问,最后在清单中声明您的应用程序类请询问

答案 1 :(得分:0)

在assets文件夹中创建一个名为“font”的新文件夹,然后在那里添加你的字体.ttf文件。在代码中,您可以在以后的任何活动中使用和更改视图字体,如下所示:

Typeface robotoBold = Typeface.createFromAsset(getAssets(), "font/roboto_bold.ttf");
textView.setTypeface(robotoBold);

答案 2 :(得分:0)

1.在资产中添加字体文件夹

2.你需要在fonts文件夹中使用font(font_name.ttf)文件。

3.在java代码中添加此内容,

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/font_name.ttf"); textview.setTypeface(typeface);

答案 3 :(得分:0)

答案 4 :(得分:0)

<强> LargeText.java

public class LargeText extends TextView {

 public LargeText(Context context) {
    super(context);

    init();
}

private void init() {
    Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "your_font_file_name.ttf");
    setTypeface(tf);
}

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

    init();
}

public LargeText(Context context, AttributeSet attrs, int defStyleAttr)    

 {
    super(context, attrs, defStyleAttr);

    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public LargeText(Context context, AttributeSet attrs, int    
 defStyleAttr, 
  int defStyleRes) {


       super(context, attrs, defStyleAttr, defStyleRes);
     init();
}

 }

在xml文件中使用以下类:(对于TextView,这是一个例子,你可以为其他组件做这个)

   <com.example.demo.LargeText
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

答案 5 :(得分:0)

在android中有多种方法可以设置自定义字体。但它不像iOS那么简单,我们必须做一些事情。根据我的经验,一种有效的方法是创建一个CustomTextView,代码如下:

public class CustomTextView extends TextView {
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(attrs);
}

public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(attrs);

}

public CustomTextView(Context context) {
    super(context);
    init(null);
}

private void init(AttributeSet attrs) {
    if (attrs != null) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.FontTextView);
        String fontName = a.getString(R.styleable.FontTextView_fontName);
        if (fontName != null) {
            Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "opensans/" + fontName);
            setTypeface(myTypeface);
        }
        a.recycle();
    }
}

}

您可以通过为其创建样式来使用自定义TextView:

<style name="TextContentStyle" parent="@android:style/TextAppearance.Medium">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">@color/textColorPrimary</item>
    <item name="fontName">OpenSans-Regular.ttf</item>
</style>

在布局中,我们使用CustomTextView以上样式:

<com.xx.xx.CustomTextView style="@style/TextContentStyle"
                    android:layout_width="match_parent"
                    android:layout_margin="@dimen/margin_medium"
                    android:gravity="center"
                    android:text="@string/txt_menu"
                    android:textColor="#FFF" />

此外,由于Typeface.createFromAsset()不是空闲的,因此我们可以通过缓存之前加载到内存中的字体来优化代码。

public class FontCache {
private static Map<String, Typeface> fontMap = new HashMap<String, Typeface>();

public static Typeface getFont(Context context, String fontName){
    if (fontMap.containsKey(fontName)){
        return fontMap.get(fontName);
    }
    else {
        Typeface tf = Typeface.createFromAsset(context.getAssets(), fontName);
        fontMap.put(fontName, tf);
        return tf;
    }
}

}

就是这样!我更喜欢这种方式,因为我们可以在任何我们想要的地方使用任何字体类型,在应用程序中使用多种字体类型。

答案 6 :(得分:0)

你可以通过双向方式实现这一目标

  1. 您可以在资产中添加和使用.ttf(字体文件) 并像这样使用它:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(),"fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface);

  2. 如果您不想在应用程序中添加字体文件,但想提供可应用的不同字体 你应该从已经安装在设备上的应用程序中获取字体,如下所示:

  3. 首先获取设备上安装的应用程序包,如下所示:

    String packName = null;
    AssetManager assetManager;
    Context assetsContext;
    String files[];
    ArrayList<String> fontList;
    
    
    private ArrayList<String> getPackName() {
            ArrayList<String> packageName = new ArrayList<String>();
            final PackageManager pm = getPackageManager();
            List<ApplicationInfo> packages = pm
                    .getInstalledApplications(PackageManager.GET_META_DATA);
            for (ApplicationInfo packageInfo : packages) {
                packageName.add(packageInfo.packageName);
            }
            return packageName;
        }
    
    
    //Now get the assets like this
    
    private void getRes(Context appPackContext, ArrayList<String> appPack) {
            ArrayList<String> mPackageList = appPack;
            String defPath = "fonts";
            for (String packageName : mPackageList) {
                packName = packageName;
                assetsContext = getFontAssetsContext(appPackContext, packName);
                assetManager = assetsContext.getAssets();
                try {
                    files = assetManager.list(defPath);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (files.length > 0) {
                    for (int i = 0; i < files.length; i++) {
                        fontsItems = new FontsItems();
                        fontList.add(files[i]); // here you get the files which are in given path (You can filter this if need)
    
                    }
                }
            }
        }
    
    
        private Context getFontAssetsContext(Context c, String packName) {
    
            try {
                return c.createPackageContext(packName,
                        Context.CONTEXT_IGNORE_SECURITY);
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return c;
    
        }
    

    我已成功运行此代码,它对我很有用,希望这对您也有帮助。