Получите доступ к шрифту один раз из актива и используйте его как ссылку

Я пытаюсь создать метод, который возвращает шрифты titleFont и contentFont, чтобы повысить эффективность, просто вернув ссылку и уменьшив длину кода. Я знаю его легко, но я не пойду. Может кто-нибудь помочь, пожалуйста. или любые альтернативы будут оценены. Извините за плохой английский

Вот метод, который будет выполняться несколько раз.

protected void onPostExecute(Article result) {
    super.onPostExecute(result);

    TextView txtTitle= (TextView) view.findViewById(R.id.title);
    txtTitle.setTypeface(titleFont);
    txtTitle.setText(result.getTitle());

    private Typeface titleFont=Typeface.createFromAsset(context.getAssets(),"fonts/InterstateCondMonoLgt.ttf");
    private Typeface contentFont=Typeface.createFromAsset(context.getAssets(),"fonts/InterstateLight.ttf");

    TextView txtMain= (TextView) view.findViewById(R.id.main);
    txtMain.setTypeface(contentFont);
    txtMain.setText(result.getContent());
}

Ответ 1

Надеюсь, это поможет вам;)

Класс FontUtil

public class FontUtil {

    private static Typeface mTitleFont;
    private static Typeface mContentFont;

    public static enum FontType {

        TITLE_FONT {
            public String toString() {
                return "fonts/InterstateCondMonoLgt.ttf";
            }
        },

        CONTENT_FONT {
            public String toString() {
                return "fonts/InterstateLight.ttf";
            }
        }
    }

    /**
     * @return Typeface Instance with the font passed as parameter
     */
    public static Typeface getTypeface(Context context, String typefaceName) {
        Typeface typeFace = null;

        try {
            if (typefaceName.equals(FontType.TITLE_FONT.toString())) {
                if (mTitleFont == null) {
                    mTitleFont = Typeface.createFromAsset(context.getAssets(), typefaceName);
                }
                typeFace = mTitleFont;
            } else if (typefaceName.equals(FontType.CONTENT_FONT.toString())) {
                if (mContentFont == null) {
                    mContentFont = Typeface.createFromAsset(context.getAssets(), typefaceName);
                }
                typeFace = mContentFont;
            } 
        } catch (Exception ex) {
            typeFace = Typeface.DEFAULT;
        }

        return typeFace;
    }

    /**
     * @return Typeface Instance with the font passed as parameter
     */
    public static Typeface getTypeface(Context context, FontType typefaceName) {
        return getTypeface(context, typefaceName.toString());
    }
}

Client

protected void onPostExecute(Article result) {
    super.onPostExecute(result);

    TextView txtTitle= (TextView) view.findViewById(R.id.title);
    txtTitle.setTypeface( FontUtil.getTypeface(mContext, FontType.TITLE_FONT) );
    txtTitle.setText(result.getTitle());

    TextView txtMain= (TextView) view.findViewById(R.id.main);
    txtMain.setTypeface( FontUtil.getTypeface(mContext, FontType.CONTENT_FONT) );
    txtMain.setText(result.getContent());
}

Ответ 2

Вы можете сделать один класс утилиты в своем проекте с помощью

 private Typeface titleFont=Typeface.createFromAsset(context.getAssets(),"fonts/InterstateCondMonoLgt.ttf");
    private Typeface contentFont=Typeface.createFromAsset(context.getAssets(),"fonts/InterstateLight.ttf");

а затем просто напишите его для него как

pubic Typeface getTitleFont() {
return titleFont;
}

или что мне больше нравится, если у вас есть унаследованные классы, которые вы помещаете в свой базовый класс, например:

public static Typeface titleFont;

а затем

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        titleFont=Typeface.createFromAsset(context.getAssets(),"fonts/InterstateCondMonoLgt.ttf");
}

Таким образом, у вас всегда будут шрифты просто позвоните textView.setTypeface(titleFont); где угодно.

Ответ 3

Все переменные, созданные внутри определенного метода, являются частными сами по себе. Вы не можете использовать модификаторы доступа для любых переменных, объявленных внутри метода. Это даст вам ошибку компиляции. Я предлагаю вам объявить эту переменную типа в качестве переменной уровня класса и инициализировать ее внутри конструктора ASYNCTASK. В противном случае каждый раз, когда ваш onPostExecute() будет вызван, каждый раз, когда он создаст шрифт, который может вызвать накладные расходы памяти в более поздний момент времени.

Ответ 4

Создайте некоторый класс util и поместите туда весь код:

public class Utils
{
    public static Typeface getTitleFont()
    {
        return Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/InterstateCondMonoLgt.ttf");
    }
}

И используйте вот так:

TextView txtMain= (TextView) view.findViewById(R.id.main);
txtMain.setTypeface(your_package.Utils.getTitleFont());