Почему не работает раздутая группа просмотра?

В общем, я пытаюсь изменить шрифт во всех представлениях макета xml. Это можно сделать только с помощью не-xml-подхода. По какой-то причине setFont не будет работать с моим дочерним элементом группы с завышенным представлением. Я думаю, что я неправильно понимаю viewGroup... Как я могу лучше создать экземпляр? Код работает, когда я использую обычное представление, такое как кнопка, но я не хочу определять миллион кнопок и текстовых представлений, поэтому мое решение состояло в том, чтобы создать группу просмотра, созданную из макета, и перебирать все представления в нем, чтобы изменить шрифт. Угу помогите пожалуйста!

public static void applyFonts(final View v, Typeface fontToSet) {
    try {

        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;

            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                applyFonts(child, fontToSet);
            }
        } else if (v instanceof TextView) {
            ((TextView) v).setTypeface(fontToSet);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ViewGroup vg = (ViewGroup) inflater.inflate(R.layout.main, null);


    Typeface rockwellFont = Typeface.createFromAsset(getAssets(), "Rockwell.ttf");
     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     ViewGroup vg = (ViewGroup) inflater.inflate(R.layout.main, null);
     applyFonts(vg,rockwellFont);
     setContentView(vg);

person Kohler Fryer    schedule 14.02.2013    source источник
comment
проверьте это.. stackoverflow.com/questions/ 7484471/   -  person Sankar V    schedule 14.02.2013
comment
у вас нет адаптера? с адаптером вы можете сделать это очень легко   -  person William Kinaan    schedule 14.02.2013
comment
Вы на самом деле используете vg в своем Activity как представление контента или как часть представления контента, или вы просто увеличиваете его?   -  person user    schedule 14.02.2013
comment
То, что сказал @Luksprog, вероятно, является проблемой - вы, вероятно, звоните setContentView(R.layout.main), а не setContentView(vg). Это увеличивает новый ViewGroup вместо того, чтобы использовать тот, на который у вас есть ссылка.   -  person Adam S    schedule 14.02.2013
comment
Большое спасибо, ребята, я попробую их, когда вернусь домой. Вы правы, я помню вызов setContentView(R.layout.main) вместо setContentView(vg). Это имеет смысл, я создал новый экземпляр представления и никогда его не использовал.   -  person Kohler Fryer    schedule 14.02.2013
comment
Сделал это сейчас, я получаю фатальное исключение main---java.lang.runtime error   -  person Kohler Fryer    schedule 15.02.2013
comment
Любые идеи? Я посмотрю на это   -  person Kohler Fryer    schedule 15.02.2013
comment
Ой, подождите, я вижу исключение нулевого указателя — что будет нулевым в этом коде?   -  person Kohler Fryer    schedule 15.02.2013


Ответы (1)


Лучше, если вы расширите свое представление, в котором вы хотите иметь собственные шрифты.

package com.shahidawat.external;

    import com.shahidawat.R;
    import android.content.Context;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.widget.TextView;

public class CustomTextView extends TextView {

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

        }

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

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

        private void init(Context context) {
                Typeface type = Typeface.createFromAsset(context.getAssets(),
                                "fonts/MonotypeCorsiva.ttf");

                setTypeface(type);
                setTextColor(context.getResources().getColor(R.color.black));
        }

}

то в XML вы можете сделать так

<com.shahidawat.external.CustomTextView
        android:id="@+id/txtHeader"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_marginBottom="5dp"
        android:background="@drawable/separater"
        android:gravity="bottom|center_horizontal"
        android:text="Header"
        android:textSize="20sp"
        android:textStyle="bold" />
person Rohit    schedule 14.02.2013