是否可以为活动中的所有TextView设置字体?我可以使用以下方法设置单个textView的字体:
TextView tv=(TextView)findViewById(R.id.textView1);
Typeface face=Typeface.createFromAsset(getAssets(), "font.ttf");
tv.setTypeface(face);
但是我想一次更改所有textView,而不是为每个textView手动设置,任何信息都将不胜感激!
答案 0 :(得分:90)
Solution1 ::只需通过将父视图作为参数传递来调用这些方法。
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 ::您可以使用自定义字体继承TextView类,并使用它而不是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);
}
}
}
答案 1 :(得分:8)
我个人收藏中的那篇:
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);
}
}
答案 2 :(得分:3)
如果您正在寻找更通用的编程解决方案,我创建了一个静态类,可用于设置整个视图的字体(Activity UI)。请注意,我正在使用Mono(C#),但您可以使用Java轻松实现它。
您可以将此类传递给您要自定义的布局或特定视图。如果你想要超高效,可以使用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");
}
}
}
在您的活动中,您需要创建一个Typeface对象。我使用放在我的Resources / Assets /目录中的.ttf文件在OnCreate()中创建我的。确保该文件在其“属性”中标记为Android资产。
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);
}
答案 3 :(得分:1)
扩展Agarwal的答案......您可以通过切换TextView的样式来设置常规,粗体,斜体等。
navigator.camera.getPicture(onPhotoDataSuccess, onFail, {
quality: 50,
cameraDirection:1,
destinationType: destinationType.DATA_URL});
}
您的Assets文件夹应如下所示:
最后,xml中的TextView应该是TextViewAsap类型的视图。现在它可以使用您编码的任何样式......
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);
}
}
}
答案 4 :(得分:1)
最佳答案
<强> 1。为一个textView设置自定义字体
Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "Fonts/FontName.ttf");
textView.setTypeface (typeface);
<强> 2。为所有textViews设置自定义字体
创建如下所示的JavaClass
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);
}
}
在你的xml页面
<packageName.javaClassName>
...
/>
=&GT;
<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" />
答案 5 :(得分:0)
**它提出了一个涉及viewgroup children的方法setTextSize(int,float)的想法,但你可以像你的问题一样采用它来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();
}
}
<强>注意:强>
使用反射应该非常小心。反思课非常&#34; 特殊&#34;答案 6 :(得分:0)
您可以使用Calligraphy
库,该库在这里可用:
Android Calligraphy Library
答案 7 :(得分:0)
您可以使用样式继承。
让活动中的每个TextView都通过module.exports = {
build: {
extend(config, { isDev , isClient }) {
if (isClient && !isDev) {
config.optimization.splitChunks.maxSize = 250000
}
}
}
}
声明样式,而不是通过手动android:textAppearence
声明样式。
然后,让每个人的样式都继承活动样式,如下所示:
android:typeface
在style.xml中:
<TextView ...
android:textAppearance="@style/item_name"/>
<TextView ...
android:textAppearance="@style/item_details"/>