Переключить редактирование шрифта текста

Привет всем, я делаю приложение, в котором пользователь может выделять текст курсивом при нажатии кнопки.

// Captures Contextual Menu Clicks//
public void onContextualMenuItemClicked(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.bold) {
        // do some stuff
    }

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

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

        spannable.setSpan(new StyleSpan(Typeface.ITALIC) , startSelection , endSelection , 0);



        StyleSpanRemover spanRemover = new StyleSpanRemover();

        spanRemover.RemoveStyle(spannable,startSelection,endSelection,Typeface.ITALIC);
    }

этот код делает его курсивом

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

        spannable.setSpan(new StyleSpan(Typeface.ITALIC) , startSelection , endSelection , 0);

Это делает его не курсивным

        StyleSpanRemover spanRemover = new StyleSpanRemover();

        spanRemover.RemoveStyle(spannable,startSelection,endSelection,Typeface.ITALIC

Я хочу, чтобы пользователь нажимал одну и ту же кнопку, чтобы выделять и не выделять курсивом. Что, если я могу использовать статус, чтобы получить, какой TypeFace является составным выбранным словом? Таким образом, он знает, выделять курсивом или нет.

ОБНОВЛЕНИЕ: это то, что у меня есть сейчас

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

        StyleSpan[] spans = spannable.getSpans(startSelection, endSelection, StyleSpan.class);

        if (spans.length == 0) {

            spannable.setSpan(new StyleSpan(Typeface.ITALIC), startSelection, endSelection , 0);

        } else {

            spannable.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection , 0);
        }

хотя код запускает код

  spannable.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection , 0);

и возвращает его в нормальное состояние. но он не установит значение spans.length обратно в ноль, поэтому я не могу снова выделить его курсивом, как установить значение spans.length в ноль.


person Jordan    schedule 10.09.2015    source источник


Ответы (1)


Вы можете использовать getSpans(startSelection, endSelection, StyleSpan.class), чтобы увидеть, какие интервалы присутствуют в выбранном диапазоне. Исходя из этого, вы можете решить, следует ли (и как) выделять текст курсивом. Обратите внимание, что пользователь может выделить часть, которая содержит как обычный текст, так и текст, выделенный курсивом.

ИЗМЕНИТЬ

StyleSpan[] spans = spannable.getSpans(startSelection, endSelection, StyleSpan.class);
if (spans.length == 0) {
    // no spans, italicize text here
} else {
    // TODO
}
person Karakuri    schedule 10.09.2015
comment
как мне использовать это в операторе if? Спасибо Джордан :) - person Jordan; 11.09.2015
comment
Если в диапазоне нет интервалов, то его нельзя выделять курсивом. В противном случае что-то выделено курсивом. - person Karakuri; 11.09.2015
comment
Я понимаю предпосылки этого, да. Я просто не могу понять, как поместить это в код, если (getSpans(startSelection, endSelection, StyleSpan.class) =?) {} - person Jordan; 11.09.2015