2012-01-03 5 views
2

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

Ниже кода я применяю.

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); 

Спасибо.

+1

Вы смотрели на http://stackoverflow.com/questions/7338697/android-development-how-to-replace-part-of -an-edittext-with-a-spannable или http://stackoverflow.com/questions/8191414/using-spannablestring-builder-and-rich-text? – Alin

+0

У кого-нибудь есть ответ на этот вопрос? Alin - эти вопросы и ответы не затрагивают использование пользовательского шрифта из папки с ресурсами. –

+0

Привет, AamirKhan, пожалуйста, помогите мне, как вы решаете эту проблему. Я пытаюсь выбрать ответ, но не успех. – mukesh

ответ

-2

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

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

+0

, что означает, что span только можно использовать с BOLD ITALIC UNDERLINE? И если это так, то есть есть ли другой способ изменить тип лица выбранной части edittext из папки с активами – Aamirkhan

+0

Да, StyleSpan не может изменить шрифт одной части текста, он сделан только для изменения стиля (полужирный, курсив и т. д.). TextView может иметь только один шрифт. – clemp6r

1

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

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

ok попробует это спасибо – Aamirkhan

+0

Mr. shmuelp, пожалуйста, скажите мне, как изменить метод getSpanTypeId() для установки настраиваемого шрифта на выделенный текст editview. – mukesh

+0

mukesh, я не знаю, что делает этот метод, но другие классы, наследующие MetricAffectingSpan, похоже, поставляют его. Возвращение значения-заполнителя, как, например, выше, работает. – shmuelp

Смежные вопросы