2014-01-18 3 views
0

Я хочу использовать пользовательские шрифты в приложении для Android. Я использую следующий метод, чтобы задать пользовательский шрифт для всех TextView в виде Activity или Fragment:Установите собственный шрифт для всех TextView (кроме ActionBar)

public static void setTypeFace(Typeface typeFace, ViewGroup parent){ 
    for (int i = 0; i < parent.getChildCount(); i++) { 
     View v = parent.getChildAt(i); 
     if (v instanceof ViewGroup) { 
      setTypeFace(typeFace, (ViewGroup) v); 
     } else if (v instanceof TextView) { 
      TextView tv = (TextView) v; 
      tv.setPaintFlags(tv.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); 
      tv.setTypeface(typeFace); 
     } 
    } 
} 

активность:

public class MyActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     ViewGroup vg = (ViewGroup)getWindow().getDecorView(); 
     ViewUtil.setTypeFace(tf, vg); 
     ... 
    } 

Он хорошо работает. Но, к сожалению, шрифт ActionBar также изменен. Я не хочу этого ..

Как я могу адаптировать этот метод, чтобы исключить TextBoxs ActionBar?

Спасибо!

+0

определить собственную тему с товаром андроида: textViewStyle – pskink

+0

Я обновил свой вопрос (добавьте код MyActivity). – Guicara

+0

и я повторяю: google о типах виджета и defaukt – pskink

ответ

0

Решение было идентифицировать идентификационное имя двух текстовых полей ActionBar: android:id/action_bar_title и android:id/action_bar_subtitle. Вы можете сделать это с помощью инструмента SDK иерархического просмотра (спасибо @pskink!).

public static void setTypeFace(Typeface typeFace, ViewGroup parent){ 
    for (int i = 0; i < parent.getChildCount(); i++) { 
     View v = parent.getChildAt(i); 
     if (v instanceof ViewGroup) { 
      setTypeFace(typeFace, (ViewGroup) v); 
     } else if (v instanceof TextView) { 
      TextView tv = (TextView) v; 
      String tvIdName = tv.getResources().getResourceName(tv.getId()); 
      if (!tvIdName.equals("android:id/action_bar_title") && !tvIdName.equals("android:id/action_bar_subtitle")) { 
       if (DO_SUBPIXEL_RENDERING){ 
        tv.setPaintFlags(tv.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); 
       } 
       tv.setTypeface(typeFace); 
      } 
     } 
    } 
} 
+1

отличный, кстати, вы можете просто сравнить целые числа tv.getId() == R.id.action_bar_ (sub) title – pskink

0

Вы можете создать свой собственный TextView по Переопределение TextView так:

public class MyTextView extends TextView { 

    public MyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setType(context); 
    } 

    public MyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setType(context); 
    } 

    public MyTextView(Context context) { 
     super(context); 
     setType(context); 
    } 

    private void setType(Context context){ 
     this.setTypeface(Typeface.createFromAsset(context.getAssets(), 
        "foo.ttf")); 

     this.setShadowLayer(1.5f, 5, 5, getContext().getResources().getColor(R.color.black_shadow)); 
    } 
} 

И использовать его как это:

<com.your.project.package.MyTextView 
     android:id="@+id/oppinfo_mtv_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:text="Player 1" 
     /> 
+0

Это решение, но это не очень удобно для моего использования. – Guicara

Смежные вопросы