Добавить фон в ImageSpan

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

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

Требование

Это то, что я пробовал.

    public void applySpannable(String lastString, String changeString, int type, String title) {

        String totalString = lastString + title;
        Spannable spanText = new SpannableString(totalString);

        Drawable d;
        if (type == 1) {
            d = getResources().getDrawable(R.drawable.type_flag_bg_red);
        } else {
            d = getResources().getDrawable(R.drawable.type_flag_bg_red);
        }
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
        ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);

        ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.WHITE);
        BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.RED);

        spanText.setSpan(foregroundSpan, lowerBound, upperBound, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        spanText.setSpan(backgroundSpan, lowerBound, upperBound, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        spanText.setSpan(span, lastString.length(), lastString.length()+1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);



        edtAddTask.setText(spanText);
        edtAddTask.setSelection(edtAddTask.getText().toString().length());
    }

Строка отображается с фоном, но прозрачное изображение отображается без фона. Я установил нижний индекс перед позицией изображения.

Спасибо


person Suresh Basnet    schedule 29.01.2018    source источник
comment
вы вообще не используете ImageSpan span, чего на самом деле вы хотите добиться?   -  person pskink    schedule 29.01.2018
comment
Мне нужно установить фон для изображения, как показано на изображении выше. Диапазон фона устанавливает фон для строки, но не устанавливает фон для изображения.   -  person Suresh Basnet    schedule 29.01.2018
comment
Итак, какое у вас изображение и какой фон вы хотите установить? скорее всего, вам нужен LayerDrawable, который рисует несколько Drawables в виде слоев   -  person pskink    schedule 29.01.2018
comment
Можно ли будет изменить часть строки edittext с помощью LayerDrawable   -  person Suresh Basnet    schedule 29.01.2018
comment
я понятия не имею, что вы имеете в виду   -  person pskink    schedule 29.01.2018
comment
Вот ссылка на демонстрационное видео. Не могли бы вы взглянуть. drive.google.com/file/d/1Tl6NLN9suGzgGM3GeStR- EeBbB-kAZI7/   -  person Suresh Basnet    schedule 29.01.2018
comment
@ Суреш Баснет, у тебя есть решение этого вопроса?   -  person Deva    schedule 04.02.2020


Ответы (1)


Вы не можете использовать BackgroundColorSpan и ImageSpan одновременно. Идея заключается в создании ImageSpan из LayerDrawable со слоями фона и изображения. Посмотрите на следующий код:

Попробуйте это для Java:

Spannable span = new SpannableString("This is   ic launcher with background");
Drawable myImage = context.getResources().getDrawable(R.drawable.ic_launcher_foreground);
ShapeDrawable background = new ShapeDrawable();
background.getPaint().setColor(Color.RED);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{background, myImage});
layerDrawable.setBounds(0, 0, 64, 64);
ImageSpan image = new ImageSpan(layerDrawable, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 8, 9, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

textView.setText(span);

Для котлина:

val span: Spannable = SpannableString("This is   ic launcher with background")
val myImage: Drawable = resources.getDrawable(R.drawable.ic_launcher_foreground)
val background = ShapeDrawable()
background.paint.color = Color.RED
val layerDrawable = LayerDrawable(arrayOf(background, myImage))
layerDrawable.setBounds(0, 0, 64, 64)
val image = ImageSpan(layerDrawable, ImageSpan.ALIGN_BASELINE)
span.setSpan(image, 8, 9, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)

textView.setText(span)

Из этого ответа: https://stackoverflow.com/a/60150320/6160172

person Jamil Hasnine Tamim    schedule 17.02.2020