편집 : 그래서 오랜만에 이것을 수행하는 가장 좋은 방법이라고 생각하는 것을 XML을 통해 추가하고 싶습니다!
따라서 먼저 사용자 정의하려는 뷰를 재정의하는 새 클래스를 만들고 싶을 것입니다. (예 : 사용자 정의 서체가있는 버튼을 원하십니까? 확장 Button
). 예를 들어 보겠습니다.
public class CustomButton extends Button {
private final static int ROBOTO = 0;
private final static int ROBOTO_CONDENSED = 1;
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
parseAttributes(context, attrs); //I'll explain this method later
}
public CustomButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
parseAttributes(context, attrs);
}
}
이제 XML 문서가없는 경우 아래에 XML 문서를 res/values/attrs.xml
추가하고 다음을 추가합니다.
<resources>
<!-- Define the values for the attribute -->
<attr name="typeface" format="enum">
<enum name="roboto" value="0"/>
<enum name="robotoCondensed" value="1"/>
</attr>
<!-- Tell Android that the class "CustomButton" can be styled,
and which attributes it supports -->
<declare-styleable name="CustomButton">
<attr name="typeface"/>
</declare-styleable>
</resources>
자, 이제 그 parseAttributes()
방법으로 이전 의 방법으로 돌아 갑시다 .
private void parseAttributes(Context context, AttributeSet attrs) {
TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);
//The value 0 is a default, but shouldn't ever be used since the attr is an enum
int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);
switch(typeface) {
case ROBOTO: default:
//You can instantiate your typeface anywhere, I would suggest as a
//singleton somewhere to avoid unnecessary copies
setTypeface(roboto);
break;
case ROBOTO_CONDENSED:
setTypeface(robotoCondensed);
break;
}
values.recycle();
}
이제 모든 설정이 완료되었습니다. 무엇이든에 대해 더 많은 속성을 추가 할 수 있지만 (굵게, 기울임 꼴 등) typefaceStyle에 대해 다른 속성을 추가 할 수 있습니다. 이제 사용 방법을 살펴 보겠습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.yourpackage.name.CustomButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me!"
custom:typeface="roboto" />
</LinearLayout>
xmlns:custom
줄은 정말 아무것도 할 수 있지만 규칙은 위에 표시되는 것입니다. 중요한 것은 고유하다는 것이므로 패키지 이름이 사용됩니다. 이제 custom:
속성에 접두사를 사용하고 android:
Android 속성에 접두사를 사용합니다.
마지막으로, 스타일 ( res/values/styles.xml
) 에서 이것을 사용 하려면 줄을 추가 하지 않아야 합니다 xmlns:custom
. 접두사없이 속성 이름을 참조하십시오.
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
Android에서 사용자 지정 서체 사용
이것은 도움이 될 것입니다. 기본적으로 XML로이 작업을 수행 할 수있는 방법이 없으며 내가 알 수있는 한 코드에서이 작업을 수행하는 더 쉬운 방법이 없습니다. 서체를 한 번 생성 한 다음 각각에 대해 setTypeface ()를 실행하는 setLayoutFont () 메서드를 항상 가질 수 있습니다. 레이아웃에 새 항목을 추가 할 때마다 업데이트하면됩니다. 아래와 같은 것 :
public void setLayoutFont() {
Typeface tf = Typeface.createFromAsset(
getBaseContext().getAssets(), "fonts/BPreplay.otf");
TextView tv1 = (TextView)findViewById(R.id.tv1);
tv1.setTypeface(tf);
TextView tv2 = (TextView)findViewById(R.id.tv2);
tv2.setTypeface(tf);
TextView tv3 = (TextView)findViewById(R.id.tv3);
tv3.setTypeface(tf);
}
편집 : 그래서 나는 이것과 같은 것을 직접 구현하고 어떻게 끝 냈는지 다음과 같은 기능을 만드는 것으로 끝났습니다.
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
그런 다음 onCreate ()에서이 메서드를 사용하고 업데이트하려는 모든 TextView를 전달합니다.
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
9/5/12 수정 :
그래서 이것은 여전히 조회수와 투표를 받고 있기 때문에 훨씬 더 좋고 완전한 방법을 추가하고 싶습니다.
Typeface mFont = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
ViewGroup root = (ViewGroup)findViewById(R.id.myrootlayout);
setFont(root, mFont);
/*
* Sets the font on all TextViews in the ViewGroup. Searches
* recursively for all inner ViewGroups as well. Just add a
* check for any other views you want to set as well (EditText,
* etc.)
*/
public void setFont(ViewGroup group, Typeface font) {
int count = group.getChildCount();
View v;
for(int i = 0; i < count; i++) {
v = group.getChildAt(i);
if(v instanceof TextView || v instanceof Button /*etc.*/)
((TextView)v).setTypeface(font);
else if(v instanceof ViewGroup)
setFont((ViewGroup)v, font);
}
}
레이아웃의 루트에 전달하면 해당 레이아웃 내에서 TextView
또는 Button
뷰 (또는 if 문에 추가 한 다른 항목)를 재귀 적으로 확인 하고 ID로 지정할 필요없이 글꼴을 설정합니다. 물론 이것은 모든 뷰에 글꼴을 설정하고 싶다고 가정합니다 .