Получите доступ к шрифту один раз из актива и используйте его как ссылку
Я пытаюсь создать метод, который возвращает шрифты 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());