Как установить пользовательский (ариальный) тип лица через XML, а не через Java-код - PullRequest
1 голос
/ 04 апреля 2011

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

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

открытый класс MidColorTextView extends 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");
}

}

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

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

1. Определите это в XML:

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

    <com.xyz.util.MidColorTextView
            xyz:token="#" 
            xyz:colorSpan="@color/BrightRed"
            xyz:text="@string/AppraisingStaffBottomText_imanage"
            style="@style/contentDescriptionText" />

2. Создатькласс MidColorTextView

    package com.xyz.util;

    public class MidColorTextView extends 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;
    }

    }

3. Создать класс FontManager

public class FontManager {
    private Typeface typefaceArial;
    private  Context context;

    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 используется для цветного текста между определенными токенами.

Вот строковый ресурс для проверки:

<string name="AppraisingStaffBottomText_imanage">The meeting&lt;br>&lt;br>PAST&lt;br>Allow the employee to give you
        their view of their positive
        progress over the past period, focus them on this with open
        questions, such as:&lt;br>&lt;i>#\"What has been your important contribution over the past
        6
        months?\"#&lt;/i>&lt;br>&lt;i>#\"What have your learned about your role?\"#&lt;/i>&lt;br>
        &lt;i>#\"What has been your important success?\"#&lt;/i>&lt;br>Don\'t rake over past mistakes,
        don\'t focus on poor performance
        - you cannot change that, reserve those discussions future
        development - see below&lt;br>&lt;br>PRESENT&lt;br>Using open questions, help staff to identify
        their true strengths,
        capabilities, attributes, skills and attitudes. Create a
        comprehensive picture of them as a strategic contributor and
        resource.&lt;br>What are your skills, and to what level?&lt;br>&lt;i>#\"What have you added as
        capabilities over the past months?\"#&lt;/i>&lt;br>&lt;i>#\"What do you find are your
        most useful personal attributes in
        your role?\"#&lt;/i>&lt;br>&lt;br>FUTURE&lt;br>The future is the period where changes in
        capability and
        performance can be made.&lt;br>This discussion is where your people can figure out -
        with your
        help - what development they need to reach your performance
        standards and their career goals. It begins with understanding
        their career goals, so ....&lt;br>&lt;i>#\"What are your goals?\"#&lt;/i>&lt;br>&lt;i>#\"What
        development will be needed?\"#&lt;/i>
        &lt;br>&lt;i>#\"You have seen over the past months that you may need more skill in these
        areas .......................... what should we do about
        that?\"#&lt;/i>&lt;br>&lt;br>Finally: Agree a specific development plan that includes
        training/experience in the areas where more skill is needed. Fix dates
        in the diary&lt;br>&lt;br>The Manager\'s role is one of Mentor and Guide; not
        Judge and
        Jury</string>
0 голосов
/ 04 апреля 2011

открытый класс MidColorTextView расширяет TextView {приватный String token;частный статический контекстный контекст;приватная строка colorSpan;private int colorCode;приватная статическая гарнитура 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");
}

}

0 голосов
/ 04 апреля 2011

Вы можете применить гарнитуру в стиле

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...