Как установить персонализированный (arial) тип лица через xml не через java-код

Я уже знал об этом: Typeface typefaceArial = Typeface.createFromAsset(context.getAssets(), "arial.ttf" );

но когда я создаю следующий класс, он работает, но он дает предупреждение с низким уровнем памяти.

Открытый класс MidColorTextView расширяет TextView {

private CharSequence text;
private String token;
private static Context context;
private String colorSpan;
private int colorCode;
private static Typeface typefaceArial;

public MidColorTextView( Context context , AttributeSet attrs )
{
    super(context, attrs);
    this.context=null;
    this.context = context;


    for(int i = 0; i < attrs.getAttributeCount(); i ++ )
    {
        // Log.i(TAG, attrs.getAttributeName(i));
        /*
         * Read value of custom attributes
         */

        this.text = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.lht", "text");

        this.token = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.lht", "token");
        this.colorSpan = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.lht", "colorSpan");
        // Log.i("TAG", "token " + token);
        // Log.i("TAG", "text " + text);
        // Log.i("TAG", "colorSpan " + colorSpan);

    }
    init();
}

private void init ()
{
    if(text.charAt(0) == '@')
    {
        String tempText = (String) text.subSequence(1, text.length());
        this.text = Html.fromHtml(getResources().getString(Integer.parseInt(tempText)));

    }
    if(token.charAt(0) == '@')
    {
        String tempText = (String) token.subSequence(1, token.length());
        this.token = getResources().getString(Integer.parseInt(tempText));
    }
    if(colorSpan.charAt(0) == '@')
    {
        String tempText = (String) colorSpan.subSequence(1, colorSpan.length());
        this.colorSpan = getResources().getString(Integer.parseInt(tempText));
    }

    setColorCode(Color.parseColor(colorSpan));

    CharSequence textWitoutToken = null;
    String tempString = text.toString();

    // ---------checking whether text containg token or not.
    if(tempString.contains(token))
    {
        textWitoutToken = setSpanBetweenTokens(text, token, new ForegroundColorSpan(colorCode));
    }
    else
    {
        textWitoutToken = text;
    }
    textContent = null;
    setText(textWitoutToken);
    setTypefaceArial ();
    setTypeface(getTypefaceArial ());

}



public int getColorCode ()
{
    return colorCode;
}

public void setColorCode ( int colorCode )
{
    this.colorCode = colorCode;
}

private CharSequence textContent;


public static Typeface getTypefaceArial ()
{
    return typefaceArial;
}
public static void setTypefaceArial ()
{
    MidColorTextView.typefaceArial= Typeface.createFromAsset(context.getAssets(), "arial.ttf");
}

}

Ответ 1

Я решил эту проблему, используя класс singltone. Я даю полный код, чтобы он мог помочь другим.


определить это в xml

xmlns: lht = "http://schemas.android.com/apk/res/com.lht" android: id = "@+ id/basicLayout"

------------------------ Создайте класс MidColorTextView в пакете com.xyz.util ------------ ------------------------- Открытый класс MidColorTextView расширяет TextView {

private CharSequence text;
private String token;
private  Context context;
private String colorSpan;
private int colorCode;


public MidColorTextView( Context context , AttributeSet attrs )
{
    super(context, attrs);
    this.context = context;


    for(int i = 0; i < attrs.getAttributeCount(); i ++ )
    {
        // Log.i(TAG, attrs.getAttributeName(i));
        /*
         * Read value of custom attributes
         */

        this.text = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.xyz", "text");

        this.token = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.xyz", "token");
        this.colorSpan = attrs.getAttributeValue("http://schemas.android.com/apk/res/com.xyz", "colorSpan");
        // Log.i("TAG", "token " + token);
        // Log.i("TAG", "text " + text);
        // Log.i("TAG", "colorSpan " + colorSpan);

    }
    init();
}

private void init ()
{

    if(text.charAt(0) == '@')
    {
        String tempText = (String) text.subSequence(1, text.length());
        this.text = Html.fromHtml(getResources().getString(Integer.parseInt(tempText)));

    }
    if(token.charAt(0) == '@')
    {
        String tempText = (String) token.subSequence(1, token.length());
        this.token = getResources().getString(Integer.parseInt(tempText));
    }
    if(colorSpan.charAt(0) == '@')
    {
        String tempText = (String) colorSpan.subSequence(1, colorSpan.length());
        this.colorSpan = getResources().getString(Integer.parseInt(tempText));
    }

    setColorCode(Color.parseColor(colorSpan));

    CharSequence textWitoutToken = null;
    String tempString = text.toString();

    // ---------checking whether text containg token or not.
    if(tempString.contains(token))
    {
        textWitoutToken = setSpanBetweenTokens(text, token, new ForegroundColorSpan(colorCode));
    }
    else
    {
        textWitoutToken = text;
    }
    textContent = null;
    setText(textWitoutToken);
    setTypeface(FontManager.getInstance(context).getTypefaceArial ());

}

public void setText ( CharSequence text , String token , int color )
{
    setText(setSpanBetweenTokens(text, token, new ForegroundColorSpan(color)));

    setTypeface(FontManager.getInstance(context).getTypefaceArial ());

}

public int getColorCode ()
{
    return colorCode;
}

public void setColorCode ( int colorCode )
{
    this.colorCode = colorCode;
}

private CharSequence textContent;

public CharSequence setSpanBetweenTokens ( CharSequence text , String token , CharacterStyle... cs )
{
    // Start and end refer to the points where the span will apply
    int tokenLen = token.length();
    int start = text.toString().indexOf(token) + tokenLen;
    int end = text.toString().indexOf(token, start);
    if(start > - 1 && end > - 1)
    {
        // Copy the spannable string to a mutable spannable string
        SpannableStringBuilder ssb = new SpannableStringBuilder(text);
        for(CharacterStyle c : cs)
        {
            ssb.setSpan(c, start, end, 0);
        }
        // Delete the tokens before and after the span
        ssb.delete(end, end + tokenLen);
        ssb.delete(start - tokenLen, start);

        text = ssb;
        textContent = ssb;
        String tempString = textContent.toString();
        if(tempString.contains(token))
        {
            setSpanBetweenTokens(textContent, token, new ForegroundColorSpan(colorCode));
        }

    }

    return textContent;
}

} ----------------------------- создать еще один класс FontManager

открытый класс FontManager {   частный Typeface typefaceArial;   частный контекстный контекст;

    private static FontManager instance = null;
    private FontManager(Context context) {
        this.context = context;
        this.typefaceArial= Typeface.createFromAsset(context.getAssets(), "arial.ttf");
    }
    public synchronized static FontManager getInstance(Context context) {
        if(instance == null) {
            instance = new FontManager(context);
        }
        return instance;
    }
    public Typeface getTypefaceArial ()
    {
        return typefaceArial;
    }

}

//-------------------------

Это решит все проблемы, setSpanBetweenTokens используется для цветного текста между конкретными токенами. // ------------------ Вот строковый файл. Встреча <br> <br> PAST <br> Позвольте сотруднику дать вам       их мнение об их положительном       прогресс за прошедший период, сосредоточьте их на этом с открытым       вопросы, такие как: <br> <i> #\ "Каков был ваш важный вклад в прошлом       6       месяцев? \" # </i> <br> <i> # \ "Что вы узнали о своей роли? \" # </i> <br>       <i> #\ "Каков был ваш важный успех? \" # </i> <br> Нельзя использовать предыдущие ошибки,       Не сосредотачивайтесь на плохой работе       - вы не можете изменить это, зарезервируйте эти обсуждения в будущем       разработка - см. ниже <br> <br> ПРИСУТСТВУЕТ <br> Используя открытые вопросы, помогите персоналу идентифицировать       их истинные сильные стороны,       способности, атрибуты, навыки и отношения. Создать       всеобъемлющую картину их как стратегического вкладчика и       ресурс. <br> Каковы ваши навыки и какой уровень? <br> <i> #\ "Что вы добавили как       за последние месяцы? \" # </i> <br> <i> # \ "Что вы нашли       наиболее полезные личные атрибуты в       ваша роль? \" # </i> <br> <br> FUTURE <br> Будущее - это период, когда изменения в       возможности и       производительность может быть достигнута. <br> Это обсуждение - это то, где ваши люди могут понять -       с вашей       помощь - какая разработка им необходима для достижения вашей эффективности       стандартов и их карьерных целей. Он начинается с понимания       их карьерные цели, поэтому.... <br> <i> #\ "Каковы ваши цели? \" # </i> <br> <i> #\ "Что       вам понадобится разработка? \" # </i>       <br> <i> #\ "Вы видели за последние месяцы, что вам может потребоваться больше навыков в этих       области.......................... что нам делать       что? \" # </i> <br> <br> Наконец: Согласуйте конкретный план развития, который включает       обучение/опыт в областях, где требуется больше навыков. Фиксация дат       в дневнике <br> <br> Менеджер\роль является одним из Mentor и Guide; не       Судья и       Жюри

Ответ 2

Вы можете применить шрифт как style

Но конкретный шрифт, только в java-коде: ApiDemo

Чтобы понять, что вызывает ошибку с низкой памятью,

  • убедитесь, что это не проблема с этим конкретным шрифтом (например, попробуйте этот шрифт, который использовался в этот пример класса, расширяющего TextView.

  • уменьшите неспецифический код и протестируйте свой класс с минимальным минимальным кодом (т.е. typefaceArial=Typeface.createFromAsset(context.getAssets(), "arial.ttf") и this.text ="Testing text"; как часть конструктора, исключив все методы attrs.getAttributeValue() и особенно init() метод и т.д.)

Как только вы получите эти два изменения, вы сможете узнать, является ли задание Typeface проблемой или чем-то еще.

Ответ 3

Открытый класс MidColorTextView расширяет TextView {   закрытый токен String;   закрытый статический контекст контекста;   private String colorSpan;   private int colorCode;   частный статический Typeface typefaceArial;

public MidColorTextView( Context context , AttributeSet attrs )
{
    super(context, attrs);

    this.context = context;


    init();
}

private void init ()
{



    setTypefaceArial ();
    setTypeface(getTypefaceArial ());

}



public int getColorCode ()
{
    return colorCode;
}

public void setColorCode ( int colorCode )
{
    this.colorCode = colorCode;
}

private CharSequence textContent;


public static Typeface getTypefaceArial ()
{
    return typefaceArial;
}
public static void setTypefaceArial ()
{
    MidColorTextView.typefaceArial= Typeface.createFromAsset(context.getAssets(), "arial.ttf");
}

}