use fromhtml больше, чем textview [duplicate]

Так много ответов, но никто не работал в моем случае.

Я начал службу следующим образом.

              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    startForegroundService(intent);
                } else {
                    startService(intent);
                }

И в моей службе в onStartCommand

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText("SmartTracker Running")
                .setAutoCancel(true);
        Notification notification = builder.build();
        startForeground(NOTIFICATION_ID, notification);
    } else {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setContentTitle(getString(R.string.app_name))
                .setContentText("SmartTracker is Running...")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setAutoCancel(true);
        Notification notification = builder.build();
        startForeground(NOTIFICATION_ID, notification);
    }

И не забудьте установить NOTIFICATION_ID non zero

private static final String ANDROID_CHANNEL_ID = "com.xxxx.Location. канал "; private static final int NOTIFICATION_ID = 555;

SO все было идеально, но все еще сбой на 8.1, поэтому причина была такой, как показано ниже.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            stopForeground(true);
        } else {
            stopForeground(true);
        }

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

Итак, магическое слово

  stopSelf();

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

78
задан Mark 5 August 2015 в 21:24
поделиться

12 ответов

Используйте spanans .

Пример:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here");

// Span to set text color to some RGB value
final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); 

// Span to make text bold
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); 

// Set the text color for first 4 characters
sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

// make them also bold
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

yourTextView.setText(sb);
182
ответ дан JavierSA 22 August 2018 в 21:19
поделиться
  • 1
    Мне действительно не нравится предлагаемое решение Android, поскольку оно не работает с несколькими языками, поскольку я не знаю, сколько символов в моих словах. Я в настоящее время ищу решение, в котором у меня может быть несколько интервалов, которые я могу прикрепить к TextView, а затем они объединяются – philipp 24 July 2012 в 22:33
  • 2
    Комментарий, говорящий span, чтобы сделать текст полужирным, если он сказал span, чтобы сделать цвет текста? – Ryan 1 August 2013 в 20:02
  • 3
    @philipp, если ваша проблема состоит в том, сколько символов в вашем слове, используйте метод length () для вашей String или StringBuilder или что-то еще – Ahmed Adel Ismail 23 September 2013 в 11:23
  • 4
    еще один голос для голосования. – Behnam 7 January 2015 в 12:51
  • 5
    Если в TextView имеется длинный текст, здесь более эффективный способ – Mingfei 24 December 2015 в 10:07

Вот пример, который будет искать все вхождения слова (без учета регистра) и окрасить их в красный цвет:

String notes = "aaa AAA xAaax abc aaA xxx";
SpannableStringBuilder sb = new SpannableStringBuilder(notes);
Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(notes);
while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());

    sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
editText.setText(sb);
16
ответ дан 40-Love 22 August 2018 в 21:19
поделиться
  • 1
    Я люблю ваше имя: P Могу ли я изменить фон конкретного слова с помощью нового BackgroundColorSpan (Color.parseColor (& quot; # BFFFC6 & quot;))? – Ajay Pandya 13 February 2017 в 05:08

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

Ah, прямо здесь, в stackoverflow .

TextView TV = (TextView)findViewById(R.id.mytextview01); 
Spannable WordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(WordtoSpan);
8
ответ дан Community 22 August 2018 в 21:19
поделиться

Если вы используете Kotlin, вы можете сделать следующее, используя библиотеку android-ktx

val title = SpannableStringBuilder()
        .append("Your big island ")
        .bold { append("ADVENTURE") } 

title.text = s 

. bold является функцией расширения на SpannableStringBuilder. Вы можете увидеть документацию здесь для списка операций, которые вы можете использовать.

Другой пример:

val ssb = SpannableStringBuilder()
            .color(green, { append("Green text ") })
            .append("Normal text ")
            .scale(0.5, { append("Text at half size " })
            .backgroundColor(green, { append("Background green") })

Где green - это разрешенный RGB цвет.

Можно даже вложить промежутки, чтобы вы получили нечто вроде встроенного DSL:

bold { underline { italic { append("Bold and underlined") } } }

Для этого вам потребуется следующее на уровне вашего модуля приложения build.gradle для работы:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}
1
ответ дан David Rawson 22 August 2018 в 21:19
поделиться

Использовать этот код полезным

TextView txtTest = (TextView) findViewById(R.id.txtTest);
txtTest.setText(Html.fromHtml("This is <font color="#ff4343">Red</font> Color!"));
1
ответ дан Hadi Note 22 August 2018 в 21:19
поделиться

Если вы хотите использовать HTML, вам нужно использовать TextView.setText(Html.fromHtml(String htmlString))

. Если вы хотите делать это часто / многократно, вы можете взглянуть на класс ( SpannableBuilder ]) Я написал, так как Html.fromHtml() не очень эффективен (он использует большой синтаксический анализатор xml внутри). Это описано в этой публикации в блоге .

4
ответ дан Heiko Rupp 22 August 2018 в 21:19
поделиться

Вы можете объединить два или более промежутков. Этот способ легче раскрасить динамический текст с использованием значения длины.

SpannableStringBuilder span1 = new SpannableStringBuilder("Android");
ForegroundColorSpan color1=new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary));
span1.setSpan(color1, 0, span1.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

SpannableStringBuilder span2 = new SpannableStringBuilder("Love");
ForegroundColorSpan color2=new ForegroundColorSpan(getResources().getColor(R.color.colorSecondary));
span2.setSpan(color2, 0, span2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

Spanned concatenated=(Spanned) TextUtils.concat(span1," => ",span2);

SpannableStringBuilder result = new SpannableStringBuilder(concatenated);

TextView tv = (TextView) rootView.findViewById(R.id.my_texview);
tv.setText(result, TextView.BufferType.SPANNABLE);
1
ответ дан Jorge Palacio 22 August 2018 в 21:19
поделиться

Надеюсь, вам это поможет (он работает с несколькими языками).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

И в вашем java-коде вы можете сделать:

int color = context.getResources().getColor(android.R.color.holo_blue_light);
String string = context.getString(R.string.test_string, color);
textView.setText(Html.fromHtml(string));

Таким образом, только часть «Тест» будет окрашена (и полужирным шрифтом).

24
ответ дан Luis 22 August 2018 в 21:19
поделиться
  • 1
    Лучший ответ. Это отлично работает для интернационализированных строк. Также имеет то преимущество, что вы можете иметь цветной текст в середине вашего ресурса строки. – jt-gilkeson 1 August 2015 в 00:17
  • 2
    Дополнительные пояснения см. В разделе Styling с разделом HTML здесь . – Elisabeth 3 August 2017 в 10:47
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>")); 
45
ответ дан Nanne 22 August 2018 в 21:19
поделиться
  • 1
    Это гораздо более приятное решение исходной проблемы, чем заметный ответ. – BSnapZ 8 July 2014 в 01:04
  • 2
    Если у вас есть разрывы строк\n, это не отображает разрывы строк. – 40-Love 31 October 2014 в 15:26
  • 3
    Нет, это не красиво, нет никакой функции окраски, упомянутой в вопросе, но метод SLOW изHTML () – Viktor Yakunin 17 March 2015 в 15:13
  • 4
    Значит, использование <font color="#FFAADD>text</font> не будет работать? – milosmns 15 January 2017 в 14:21

            String str1 = "If I forget my promise to ";
            String penalty = "Eat breakfast every morning,";
            String str2 = " then I ";
            String promise = "lose my favorite toy";
           

            String strb = "<u><b><font color='#081137'>"+ penalty +",</font></b></u>";
            String strc = "<u><b><font color='#081137'>"+ promise + "</font></b></u>";
            String strd = str1 +strb+ str2 + strc;
           tv_notification.setText(Html.fromHtml(strd));

или используйте этот код:

    SpannableStringBuilder builder = new SpannableStringBuilder();
            SpannableString text1 = new SpannableString(str1);
            text1.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)), 0, str1.length() - 1, 0);
            builder.append(text1);

            SpannableString text2 = new SpannableString(penalty);
            text2.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, penalty.length(), 0);
            text2.setSpan(new UnderlineSpan(), 0, penalty.length(), 0);
            builder.append(text2);

            SpannableString text3 = new SpannableString(str2);
            text3.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)),0, str2.length(), 0);
            builder.append(text3);


            SpannableString text4 = new SpannableString(promise);
            text4.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, promise.length(), 0);
            text4.setSpan(new UnderlineSpan(),0, promise.length(), 0);
            builder.append(text4);

          tv_notification.setText(builder);

2
ответ дан Nur Gazi 22 August 2018 в 21:19
поделиться
public static void setColorForPath(Spannable spannable, String[] paths, int color) {
    for (int i = 0; i < paths.length; i++) {
        int indexOfPath = spannable.toString().indexOf(paths[i]);
        if (indexOfPath == -1) {
            return;
        }
        spannable.setSpan(new ForegroundColorSpan(color), indexOfPath,
                indexOfPath + paths[i].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

Использование

Spannable spannable = new SpannableString("Your big island ADVENTURE");
Utils.setColorForPath(spannable, new String[] { "big", "ADVENTURE" }, Color.BLUE);

textView.setText(spannable);

1
ответ дан Phan Van Linh 22 August 2018 в 21:19
поделиться

Мне нравится использовать SpannableStringBuilder, добавляя разные промежутки один за другим, вместо вызова setSpan, вычисляя длины строк

как: (код Котлина)

val amountSpannableString = SpannableString("₹$amount").apply {
  // text color
  setSpan(ForegroundColorSpan("#FD0025".parseColor()), 0, length, 0)
  // text size
  setSpan(AbsoluteSizeSpan(AMOUNT_SIZE_IN_SP.spToPx(context)), 0, length, 0)
  // font medium
  setSpan(TypefaceSpan(context.getString(R.string.font_roboto_medium)), 0, length, 0)
}

val spannable: Spannable = SpannableStringBuilder().apply {
  // append the different spans one by one
  // rather than calling setSpan by calculating the string lengths
  append(TEXT_BEFORE_AMOUNT)
  append(amountSpannableString)
  append(TEXT_AFTER_AMOUNT)
}

2
ответ дан vedant 22 August 2018 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: