Как изменить стиль получения определенного текста из базы данных firebase [duplicate]

самый короткий и наиболее эффективный способ:

  List & lt; String & gt;  list = new CopyOnWriteArrayList & lt; & gt; ();  list.removeIf (s - & gt; s.length () & lt; 1);   

внутренне создает временный массив с одинаковой длиной и копирует все элементы, где предикат возвращает true.

помните, что если вы используете этот метод для фактической итерации над элементами для выполнения какого-либо действия, эти действия не могут выполняться в paralell больше, поскольку removeIf-вызов является атомарным и блокирует обход для других потоков

55
задан Piyush 18 March 2015 в 09:21
поделиться

6 ответов

Скажите, что у вас есть TextView, называемый etx. Затем вы использовали бы следующий код:

final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO");

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold 
sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic

etx.setText(sb);

164
ответ дан stkent 17 August 2018 в 13:15
поделиться
  • 1
    да, это сработало. – Housefly 12 June 2012 в 04:06
  • 2
    будет ли это работать с пользовательскими шрифтами? – Siavash 30 March 2015 в 22:11
  • 3
    @Siavash - Он работает с пользовательскими шрифтами. – Dimmy3 29 February 2016 в 16:42
  • 4
    Для Xamarin используйте так var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold); – Elisabeth 3 August 2017 в 15:42

Ответы, приведенные здесь, являются правильными, но не могут быть вызваны в цикле, потому что объект StyleSpan представляет собой единый непрерывный диапазон (не стиль, который может применяться к нескольким промежуткам). Вызов setSpan несколько раз с тем же жирным шрифтом StyleSpan создаст один жирный диапазон и просто переместит его в родительском диапазоне.

В моем случае (показывая результаты поиска) , Мне нужно было сделать все экземпляры всех ключевых слов поиска полужирным. Это то, что я сделал:

private static SpannableStringBuilder emboldenKeywords(final String text,
                                                       final String[] searchKeywords) {
    // searching in the lower case text to make sure we catch all cases
    final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
    final SpannableStringBuilder span = new SpannableStringBuilder(text);

    // for each keyword
    for (final String keyword : searchKeywords) {
        // lower the keyword to catch both lower and upper case chars
        final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);

        // start at the beginning of the master text
        int offset = 0;
        int start;
        final int len = keyword.length(); // let's calculate this outside the 'while'

        while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
            // make it bold
            span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
            // move your offset pointer 
            offset = start + len;
        }
    }

    // put it in your TextView and smoke it!
    return span;
}

Имейте в виду, что приведенный выше код недостаточно умен, чтобы пропускать двойное смещение, если одно ключевое слово является подстрокой другого. Например, если вы ищете «Fish fi» внутри «Рыбы в засушливом море» , он сделает «рыбу» полужирным шрифтом один раз и затем "fi" . Хорошо, что пока он неэффективен и немного нежелателен, он не будет иметь визуального недостатка, так как ваш отображаемый результат будет по-прежнему выглядеть как

Рыбы в засушливом море

6
ответ дан copolii 17 August 2018 в 13:15
поделиться
  • 1
    Это лучший пока что общий и применимый во всех случаях. – Binil Jacob 4 May 2017 в 10:50

На основании ответа Имрана Раны здесь приведен общий метод многократного использования, если вам нужно применить StyleSpan s к нескольким TextView s, с поддержкой нескольких языков (где индексы являются переменными):

void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) {
    SpannableStringBuilder sb = new SpannableStringBuilder(text);
    int start = text.indexOf(spanText);
    int end = start + spanText.length();
    sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textView.setText(sb);
}

Используйте его в Activity следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    StyleSpan boldStyle = new StyleSpan(Typeface.BOLD);
    setTextWithSpan((TextView) findViewById(R.id.welcome_text),
        getString(R.string.welcome_text),
        getString(R.string.welcome_text_bold),
        boldStyle);

    // ...
}

strings.xml

<string name="welcome_text">Welcome to CompanyName</string>
<string name="welcome_text_bold">CompanyName</string>

Результат:

Добро пожаловать в CompanyName

15
ответ дан friederbluemle 17 August 2018 в 13:15
поделиться

Расширение ответа frieder на случай поддержки и диакритическую нечувствительность.

public static String stripDiacritics(String s) {
        s = Normalizer.normalize(s, Normalizer.Form.NFD);
        s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
        return s;
}

public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) {
        SpannableStringBuilder sb = new SpannableStringBuilder(text);
        int start;
        if (caseDiacriticsInsensitive) {
            start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US));
        } else {
            start = text.indexOf(spanText);
        }
        int end = start + spanText.length();
        if (start > -1)
            sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(sb);
    }
0
ответ дан luky 17 August 2018 в 13:15
поделиться

, если вы точно не знаете длину текста перед текстовой частью, которую хотите сделать полужирным шрифтом, или даже не знаете, какая длина текста выделена полужирным шрифтом, вы можете легко использовать теги HTML, такие как следующее:

yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
0
ответ дан Muhammed Refaat 17 August 2018 в 13:15
поделиться

Я рекомендую использовать файл strings.xml с CDATA

<string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>

Затем в java-файле:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
-3
ответ дан sonique 17 August 2018 в 13:15
поделиться
Другие вопросы по тегам:

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