Изменение шрифта на лету, spannable editText

У меня есть кнопка:

if (id == R.id.italic) {
}

Внутри этой кнопки у меня есть spannable:

int startSelection = noteContent.getSelectionStart()
int endSelection = noteContent.getSelectionEnd();
Spannable spannable = noteContent.getText();

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

Какой оператор if захватит шрифт spannable, чтобы он мог быть курсивным или некурсивным.

Другой способ выразить это - функция курсива, реализованная Google на диске Google для Android. Я хочу сделать это.

Пример второй:

 If (spannable.getTypeface.equals(TypeFace.ITALIC) {


 } else {

 }

Конечно, приведенный выше код инструкции if не является реальным, но это то, что я пытаюсь выяснить.

Спасибо


person Jordan    schedule 18.09.2015    source источник
comment
что не работает в Spannable#setSpan и/или Spannable#removeSpan ?   -  person pskink    schedule 18.09.2015
comment
ничего плохого в тех, что я хочу получить шрифты спанабе   -  person Jordan    schedule 18.09.2015
comment
@Jordan проверьте мой обновленный ответ, который я добавил таким образом, чтобы вы могли проверить, выделен ли шрифт жирным или курсивом.   -  person Antwan    schedule 18.09.2015


Ответы (1)


используя этот класс, вы можете установить собственный шрифт или любые шрифты, которые вы хотите использовать с помощью spannable

public class CustomTypefaceSpan extends TypefaceSpan {

private final Typeface newType;

public CustomTypefaceSpan(String family, Typeface type) {
    super(family);
    newType = type;
}

@Override
public void updateDrawState(TextPaint ds) {
    applyCustomTypeFace(ds, newType);
}

@Override
public void updateMeasureState(TextPaint paint) {
    applyCustomTypeFace(paint, newType);
}

private static void applyCustomTypeFace(Paint paint, Typeface tf) {
    int oldStyle;
    Typeface old = paint.getTypeface();
    if (old == null) {
        oldStyle = 0;
    } else {
        oldStyle = old.getStyle();
    }

    int fake = oldStyle & ~tf.getStyle();
    if ((fake & Typeface.BOLD) != 0) {
        paint.setFakeBoldText(true);
    }

    if ((fake & Typeface.ITALIC) != 0) {
        paint.setTextSkewX(-0.25f);
    }

    paint.setTypeface(tf);
}

}

вы можете использовать это так

  Spannable wordtoSpan = new SpannableString(Text.getText().toString());
            int index = public_desc.getText().toString().indexOf("any string you want");   

            wordtoSpan.setSpan(new CustomTypefaceSpan("", Any type Face), index, text.getText().tostring().lenght, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            text.setText(wordtoSpan);

РЕДАКТИРОВАТЬ, чтобы превратить это в оператор if, вы можете создать логическое значение для проверенного статуса, по умолчанию оно равно false, и когда вы нажимаете кнопку, затем инвертируете значение этого логического значения, а затем, если проверено, равно true, установите spannable, иначе установите другой spannable шрифт

или вы можете использовать это, чтобы получить шрифт с полужирным шрифтом или курсивом с этим

    typefaceB.isBold() && typefaceA.isItalic()



     If (spannable.getTypeface.isItalic()) {


 } else {

 }
person Antwan    schedule 18.09.2015
comment
как я могу превратить это в оператор if, чтобы, если бы я снова щелкнул тот же текст, он вернулся бы к нормальному @Tony - person Jordan; 18.09.2015
comment
Это выделяет жирным шрифтом весь текст в editText, а не только spannable, я делаю что-то не так? @Тони - person Jordan; 18.09.2015
comment
поэтому вы хотите выделить часть текста жирным шрифтом? В spannable вы можете установить начальный и конечный индекс, этим вы можете определить область, которая будет выделена жирным шрифтом - person Antwan; 18.09.2015
comment
хорошо, проверьте обновление Могу ли я сделать такое выражение if, которое действительно работает @Tony, вы сказали что-то о логическом выражении, можете ли вы ввести пример - person Jordan; 18.09.2015
comment
это шрифт A логическое значение в этом. (Пример логического шрифта A) @Tony - person Jordan; 18.09.2015
comment
я даю вам пример того, как проверить стиль шрифта - person Antwan; 18.09.2015
comment
в spannable.getTypeface getTypeface красный, как будто он не существует @Tony - person Jordan; 18.09.2015
comment
Есть ли вообще способ получить шрифт для spannable, а не для всего editText, как google сделал это на google drive @Tony - person Jordan; 18.09.2015