アプリケーション全体でフォントを変更し、そのためのスタイルファイルを作成しようとしています。このファイル(下記)では、AndroidのTextAppearanceスタイルの書体値を変更したいだけです。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NightRiderFont" parent="@Android:style/TextAppearance">
<item name="Android:typeface"> /***help need here***/ </item>
</style>
</resources>
ただし、フォントは「assets/fonts /」にあります。このフォントにアクセスするにはどうすればいいですか?そのスタイルをテーマとして使用して、すべてのTextViewをプログラムで手動で変更する必要がなくなります。
要約:XMLで「アセットフォルダーのファイル」にアクセスするにはどうすればよいですか?
私の研究では、外部フォントをxmlファイルに追加する方法はありません。 xmlでは3つのデフォルトフォントのみが使用可能です
ただし、このコードを使用してJavaで使用できます。
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");
textfield.setTypeface(tf,Typeface.BOLD);
更新:
TextViewを拡張するカスタムクラスを作成し、それをxmlファイルで使用することにより、これを行う方法を見つけました。
public class TextViewWithFont extends TextView {
private int defaultDimension = 0;
private int TYPE_BOLD = 1;
private int TYPE_ITALIC = 2;
private int FONT_ARIAL = 1;
private int FONT_OPEN_SANS = 2;
private int fontType;
private int fontName;
public TextViewWithFont(Context context) {
super(context);
init(null, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.font, defStyle, 0);
fontName = a.getInt(R.styleable.font_name, defaultDimension);
fontType = a.getInt(R.styleable.font_type, defaultDimension);
a.recycle();
MyApplication application = (MyApplication ) getContext().getApplicationContext();
if (fontName == FONT_ARIAL) {
setFontType(application .getArialFont());
} else if (fontName == FONT_OPEN_SANS) {
setFontType(application .getOpenSans());
}
}
private void setFontType(Typeface font) {
if (fontType == TYPE_BOLD) {
setTypeface(font, Typeface.BOLD);
} else if (fontType == TYPE_ITALIC) {
setTypeface(font, Typeface.ITALIC);
} else {
setTypeface(font);
}
}
}
およびxml
<com.example.customwidgets.TextViewWithFont
font:name="Arial"
font:type="bold"
Android:layout_width="wrap_content"
Android:text="Hello world "
Android:padding="5dp"
Android:layout_height="wrap_content"/>
xmlのルートにスキーマを追加することを忘れないでください
xmlns:font="http://schemas.Android.com/apk/res-auto"
そして、attrs.xml
ファイルはvalues
ディレクトリ内にあり、カスタム属性を保持しています。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="font">
<attr name="type">
<enum name="bold" value="1"/>
<enum name="italic" value="2"/>
</attr>
<attr name="name">
<enum name="Arial" value="1"/>
<enum name="OpenSans" value="2"/>
</attr>
</declare-styleable>
</resources>
更新:
このカスタムビューがリストビューで使用されると、ビューが読み込まれるたびにフォントオブジェクトが作成されるため、パフォーマンスの問題がいくつか見つかりました。私が見つけた解決策は、アプリケーションクラスでフォントを初期化し、そのフォントオブジェクトを参照することです
MyApplication application = (MyApplication) getContext().getApplicationContext();
アプリケーションクラスは次のようになります
public class MyApplication extends Application {
private Typeface arialFont, openSans;
public void onCreate() {
super.onCreate();
arialFont = Typeface.createFromAsset(getAssets(), QRUtils.FONT_ARIAL);
openSans = Typeface.createFromAsset(getAssets(), QRUtils.FONT_OPEN_SANS);
}
public Typeface getArialFont() {
return arialFont;
}
public Typeface getOpenSans() {
return openSans;
}
}
編集2:
最後に、xmlでフォントがサポートされます(サポートライブラリを介した下位互換性もあります): https://developer.Android.com/preview/features/fonts-in-xml.html
編集:
現在、 Calligraphy ライブラリを使用しています。これは、カスタムフォントの最も簡単な方法です。
あなたにできること:
TextView
のカスタムフォントこれを行う別の方法を見つけました。
これを使用して独自のTextView
を作成する必要があります tutorial
それほど難しくはありません。この後、あなたは自分のフォントでTextView
を使うことができます。
まだこれを見ている人がいるかどうかはわかりませんが、役立つと思いました。
単一のフォントを使用している場合、この関数を使用します。
public static void applyFont(final Context context, final View root, final String fontName) {
try {
if (root instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) root;
for (int i = 0; i < viewGroup.getChildCount(); i++)
applyFont(context, viewGroup.getChildAt(i), fontName);
} else if (root instanceof TextView)
((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontName));
} catch (Exception e) {
Log.e("ProjectName", String.format("Error occured when trying to apply %s font for %s view", fontName, root));
e.printStackTrace();
}
}
Sooryaは正しいですが、多くのtextViewに同じフォントを配置する必要がある場合は、必要なTypefaceを返す静的メソッド内にそのコードを配置することをお勧めします。コードの行が減ります。または、Applicationを拡張するクラスを作成し、Typefaceを返すGETメソッドを作成することもできます。そのメソッドは、アプリケーション内の任意のアクティビティから到達可能です(静的変数または静的メソッドを使用する必要はありません)。
fount changeは、Androidの非常に基本的な機能です。これは、ほとんどすべてのアプリケーションに必要です。リンク FountChanger.class 。
私はドロイドキッドの答えを取り、XMLに直接フォントファイル名を入力するだけで、どのフォントでも動作するようにしました:
layout.xml
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:custom="http://schemas.Android.com/apk/res-auto" >
<!-- where font file is at "assets/fonts/arial.ttf" -->
<com.odbol.widgets.TextViewWithFont
...
custom:fontFilePath="fonts/arial.ttf" />
</RelativeLayout>
Fonts.Java
public class Fonts {
// use Weak so fonts are freed from memory when you stop using them
private final static Map<String, Typeface> fonts = new WeakHashMap<>(5);
/***
* Returns a font at the given path within the assets directory.
*
* Caches fonts to save resources.
*
* @param context
* @param fontPath Path to a font file relative to the assets directory, e.g. "fonts/Arial.ttf"
* @return
*/
public synchronized static Typeface getFont(Context context, String fontPath) {
Typeface font = fonts.get(fontPath);
if (font == null) {
font = Typeface.createFromAsset(context.getAssets(), fontPath);
fonts.put(fontPath, font);
}
return font;
}
}
values/attrs.xml
<resources>
<declare-styleable name="TextViewWithFont">
<!-- a path to a font, relative to the assets directory -->
<attr name="fontFilePath" format="string" />
<attr name="type">
<enum name="bold" value="1"/>
<enum name="italic" value="2"/>
</attr>
</declare-styleable>
</resources>
TextViewWithFont.Java
public class TextViewWithFont extends TextView {
private int defaultDimension = 0;
private int TYPE_BOLD = 1;
private int TYPE_ITALIC = 2;
private int fontType;
private int fontName;
public TextViewWithFont(Context context) {
super(context);
init(null, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
// Load attributes
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.TextViewWithFont, defStyle, 0);
String fontPath = a.getString(R.styleable.TextViewWithFont_fontFilePath);
fontType = a.getInt(R.styleable.TextViewWithFont_type, defaultDimension);
a.recycle();
if (fontPath != null) {
setFontType(Fonts.getFont(getContext(), fontPath));
}
}
private void setFontType(Typeface font) {
if (fontType == TYPE_BOLD) {
setTypeface(font, Typeface.BOLD);
} else if (fontType == TYPE_ITALIC) {
setTypeface(font, Typeface.ITALIC);
} else {
setTypeface(font);
}
}
}
あなたはちょうどパブリックコールを行い、このようにメソッドを添付しました
public class TextViewFontType {
public Typeface typeface;
public void fontTextView(final TextView textView, final String fonttype) {
typeface = Typeface.createFromAsset(textView.getContext().getAssets(), fonttype);
textView.setTypeface(typeface);
}
whereメソッドTextViewがfont-familyを設定するように使用してください。
public class FontList {
public static final String gothicbNormal="fonts/gothicb.ttf";
public static final String gothicbBold="fonts/gothicb.ttf";
}
2つのパラメーターを渡すと、どこでもメソッドを呼び出した後にFontListを作成しました。
アセットフォルダーの代わりに、.ttfファイルをフォントフォルダーに配置できます。 Android 4.1(APIレベル16)以降を実行しているデバイスでXML機能のフォントサポートを使用するには、サポートライブラリ26+を使用します。resフォルダを右クリックし、新規-> Androidリソースディレクトリ->フォントの選択-> OK。「myfont.ttf」ファイルを新しく作成したフォントフォルダーに配置します。
Res/values/styles.xmlに追加し、
<style name="customfontstyle" parent="@Android:style/TextAppearance.Small">
<item name="Android:fontFamily">@font/myfont</item>
</style>
レイアウトファイルにAndroid:textAppearance = "@ style/customfontstyle"を追加し、
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textAppearance="@style/customfontstyle"/>
参照: https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml
//コードでフォントファイルにアクセスし、
Typeface type = Typeface.createFromAsset(getResources().getAssets(),"fonts/arial.ttf");
textView.setTypeface(type);//assign typeface to textview
//資産フォルダ-> fonts(foldername)-> arial.ttf(font file name)
あなたに完全に使用することを望む:-
TextView text = (TextView) findViewById(R.id.custom_font);
Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
text.setTypeface(font);
このライブラリを使用できます: https://github.com/chrisjenx/Calligraphy
レイアウトで使用するフォントを追加するだけです。このような:
<TextView
fontPath="fonts/verdana.ttf"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>