将自定义字体添加到所有LinearLayout文本视图

时间:2013-05-15 11:05:21

标签: android android-custom-view custom-font

我以编程方式添加线性布局和多个文本视图,并将自定义字体设置为文本,

我是以吼叫的方式做到的,它的作品非常完美。

MainActivity 1:

 public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

     LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout);

        TextView tv = new TextView(this);
        tv.setGravity(Gravity.RIGHT);
        tv.setTextColor(Color.GREEN);
        tv.setTextSize(40);    
        ll.addView(tv);
        Typeface face4=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");     
        tv.setTypeface(face4);
        tv.setText(Html.fromHtml(getString(R.string.trip)));    

        ImageView divider = new ImageView(this);
        LinearLayout.LayoutParams lp = 
         new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp.setMargins(10, 10, 10, 10);
        divider.setLayoutParams(lp);
        divider.setBackgroundColor(Color.BLUE);
        ll.addView(divider);

        TextView tv1 = new TextView(this);      
        tv1.setGravity(Gravity.RIGHT);
        tv1.setTextSize(40);
        ll.addView(tv1);
        Typeface face1=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");     
        tv1.setTypeface(face1);
        tv1.setText(Html.fromHtml(getString(R.string.trip1)));

        ImageView divider1 = new ImageView(this);
        LinearLayout.LayoutParams lp1 = 
         new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp1.setMargins(10, 10, 10, 10);
        divider1.setLayoutParams(lp1);
        divider1.setBackgroundColor(Color.BLUE);
        ll.addView(divider1);

        TextView tv2 = new TextView(this);
        tv2.setGravity(Gravity.RIGHT);
        tv2.setTextSize(40);
        ll.addView(tv2);
        Typeface face2=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");     
        tv2.setTypeface(face2);
        tv2.setText(Html.fromHtml(getString(R.string.trip2)));

        ImageView divider3 = new ImageView(this);
        LinearLayout.LayoutParams lp3 = 
         new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
        lp3.setMargins(10, 10, 10, 10);
        divider3.setLayoutParams(lp3);
        divider3.setBackgroundColor(Color.BLUE);
        ll.addView(divider3);       
                         }
                  }

但召回

Typeface.createFromAsset(getAssets()
每个文字

,它是一种应用自定义字体的繁重方式, 我尝试将自定义视图设置为贝娄,但它没有将自定义字体设置为文本:

MainActivity:

  public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout);

    // add text view
    TextView tv = new TextView(this);
    tv.setGravity(Gravity.RIGHT);
    tv.setTextColor(Color.GREEN);
    tv.setTextSize(40);    
    ll.addView(tv);
    tv.setText(Html.fromHtml(getString(R.string.trip)));    

    ImageView divider = new ImageView(this);
    LinearLayout.LayoutParams lp = 
     new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
    lp.setMargins(10, 10, 10, 10);
    divider.setLayoutParams(lp);
    divider.setBackgroundColor(Color.BLUE);
    ll.addView(divider);


    TextView tv1 = new TextView(this);      
    tv1.setGravity(Gravity.RIGHT);
    tv1.setTextSize(40);
    ll.addView(tv1);
    tv1.setText(Html.fromHtml(getString(R.string.trip1)));

    ImageView divider1 = new ImageView(this);
    LinearLayout.LayoutParams lp1 = 
     new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
    lp1.setMargins(10, 10, 10, 10);
    divider1.setLayoutParams(lp1);
    divider1.setBackgroundColor(Color.BLUE);
    ll.addView(divider1);


    TextView tv2 = new TextView(this);
    tv2.setGravity(Gravity.RIGHT);
    tv2.setTextSize(40);
    ll.addView(tv2);
    tv2.setText(Html.fromHtml(getString(R.string.trip2)));

    ImageView divider3 = new ImageView(this);
    LinearLayout.LayoutParams lp3 = 
     new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5);
    lp3.setMargins(10, 10, 10, 10);
    divider3.setLayoutParams(lp3);
    divider3.setBackgroundColor(Color.BLUE);
    ll.addView(divider3);
}}

CustomTextView:

    public class CustomTextView extends TextView {

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

    public CustomTextView(Context context, AttributeSet attrs) {
        //call the constructor which has the complete definition
        this(context, attrs, 0);
        init();
    }

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

    private void init() {

            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "BFantezy.ttf");
            setTypeface(tf);
        }
    }

任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:3)

不是每次都从资源创建字体,而是创建一个“FontFactory”并重复使用相同的字体。

public class FontFactory {

private static Typeface t1;

public static Typeface getBFantezy(Context c) {
    if (t1 == null) {
        t1 = Typeface.createFromAsset(c.getAssets(), "BFantezy.ttf");
    }
    return t1;
}


private static Typeface t2;

public static Typeface getOtherFont(Context c) {
    if (t2 == null) {
        t2 = Typeface.createFromAsset(c.getAssets(), "OtherFont.ttf");
    }
    return t2;
}
}

然后在您的代码中使用它:

tv1.setTypeface(FontFactory.getBFantezy(getContext());

您不再需要担心创建字体。如果需要,工厂将创建它。您可以添加类似的方法来处理您希望使用的任何其他字体。

答案 1 :(得分:2)

您已创建自定义TextView类并忘记实现它。 尝试

CustomTextView tv1 = new CustomTextView(this); 

的实例
TextView tv1 = new TextView(this); 

与所有其他TextView的

相同

希望这会有所帮助......

答案 2 :(得分:0)

您不必为每个Typeface创建TextView。您可以执行Typeface face=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");之类的操作,然后对每个TextView执行textview.setTypeface(face) createFromAsset()。只调用方法{{1}}一次并重用您获得的对象。