Как установить стиль шрифта выделенного текста, используя пользовательский шрифт через метод spannable - PullRequest
2 голосов
/ 03 января 2012

Я хочу установить стиль для выбранного текста из EditText, используя пользовательский шрифт . Я получаю ошибку ниже во время компиляции. The constructor StyleSpan(Typeface) is undefined.

Ниже кода я подаю заявку.

int start=editbox.getSelectionStart();
int end=editbox.getSelectionEnd();
Spannable span=(Spannable)editbox.getText();
StyleSpan f = new StyleSpan( 
                            Typeface.createFromAsset(getAssets(),
                             "fonts/genbkbasr.ttf"));
span.setSpan(f, start,end, 0);

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 мая 2012

Я написал класс, чтобы обойти это ограничение.Похоже, что он работал в ограниченном тестировании, но я еще не написал приложение, для которого оно мне было нужно.Обратите внимание, что предполагается, что пользовательский шрифт доступен в качестве актива, и выполняет статический вызов для получения контекста приложения (который необходим для доступа к ресурсу).Лучшим подходом было бы передать в Context конструктор ..

import android.content.Context;

public class TypefaceResourceSpan extends MetricAffectingSpan implements ParcelableSpan {

private String resourceName_;
private Typeface tf_;

public TypefaceResourceSpan(String resourceName) {
    super();
    resourceName_=resourceName;
    tf_=createTypeface(resourceName_);
}

public TypefaceResourceSpan(Parcel src) {
    resourceName_ = src.readString();
    tf_=createTypeface(resourceName_);
}

private Typeface createTypeface(String resourceName) {
    Typeface result=null;
    Context c=TikunKorimMain.getAppContext();
    if (c==null) {
        Log.e("TypefaceResourceSpan", "Application context is null!");
    }
    AssetManager am=c.getAssets();
    if (am==null) {
        Log.e("TypefaceResourceSpan", "AssetManager is null!");
    }
    result=Typeface.createFromAsset(am, resourceName);
    return result;
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(resourceName_);
}

@Override
public void updateMeasureState(TextPaint p) {
    Typeface old=p.getTypeface();
    if ( old != null && !old.isBold() && tf_.isBold() ) {
        p.setFakeBoldText(true);
    }
    if ( old != null && !old.isItalic() && tf_.isItalic() ) {
        p.setTextSkewX(-0.25f);
    }
    p.setTypeface(tf_);
}

@Override
public void updateDrawState(TextPaint tp) {
    Typeface old=tp.getTypeface();
    if ( old != null && !old.isBold() && tf_.isBold() ) {
        tp.setFakeBoldText(true);
    }
    if ( old != null && !old.isItalic() && tf_.isItalic() ) {
        tp.setTextSkewX(-0.25f);
    }
    tp.setTypeface(tf_);
}

public int getSpanTypeId() {
    // TODO does this work???!?
    return 123456;
}

public int describeContents() {
    return 0;
}
}
0 голосов
/ 03 января 2012

Принятые значения для этого конструктора задокументированы здесь:

Значения должны быть константами стиля, например Typeface.BOLD.

...