SpannableString не работает в диалоговом окне

Я хочу показать spanString жирным шрифтом, а остальную часть строки - обычным стилем TextView. Но вся TextView показывалась только в обычном стиле. Помогите пожалуйста мне.

if ((mStoreListValue.get(pos).getStoreStatus().equals("CLOSED"))){

   final Dialog dialog = new Dialog(v.getRootView().getContext(), android.R.style.Theme_Translucent_NoTitleBar);
   dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
   dialog.getWindow().setContentView(R.layout.resclosed_dialog);
   ImageView btn_close =  dialog.findViewById(R.id.close_btn);
   TextView txt_close =  dialog.findViewById(R.id.tv_closed);

   SpannableString spanString = new SpannableString(sname);
   spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

   txt_close.setText(spanString +  " " + mContext.getResources().getString(R.string.closed));

   btn_close.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
              dialog.dismiss();
         }
    });
  dialog.show();

person Mohamed Ibrahim    schedule 04.12.2017    source источник
comment
spanString + " " + ... — это неявный вызов toString() для spanString, который удаляет всю информацию о диапазоне.   -  person Mike M.    schedule 04.12.2017
comment
Возможный дубликат Почему мой текст не отображается со стилем при использовании SpannableStringBuilder?   -  person Pavneet_Singh    schedule 04.12.2017


Ответы (3)


Использовать это

SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString spanString = new SpannableString(sname);
spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(spanString);
builder.append(mContext.getResources().getString(R.string.closed));
txt_close.setText(builder);

Вместо этого

txt_close.setText(spanString +  " " + mContext.getResources().getString(R.string.closed));
person AskNilesh    schedule 04.12.2017
comment
@MohamedIbrahim рад помочь тебе, мой друг - person AskNilesh; 04.12.2017

Это потому, что вы просто объединяете SpannableString с String, что будет результатом toString() (обычная строка с хэш-кодом объекта). Используйте один String с несколькими Span.
См. следующий пример.

    String s1="My app";
    String s2= "Close";
    SpannableString spanString = new SpannableString(s1+s2);
    spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    spanString.setSpan(new StyleSpan(Typeface.NORMAL), s1.length(), (s1+s2).length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(spanString);
person ADM    schedule 04.12.2017
comment
Мне этот ответ нравится больше, чем тот, который указан как правильный, поскольку он также дает причину, по которой исходный код спрашивающего не работает так, как должен - person Ευάγγελος Μπίλης; 25.07.2018

Используя шаблоны строк, вы можете иметь строковый ресурс: <b> указывает жирным шрифтом, %1$d указывает, что я ожидаю цифру/число, поэтому я получаю (5 минут) в текстовом представлении

//xml
<string name="confirm_eta_text"> &lt;b>%1$d min &lt;/b> away</string>

// Java   
mEta.setText(
Compat.fromHtml(String.format(getResources().getString(R.string.confirm_eta_text), 5)));

Форматирование строк Android

person Demilade    schedule 04.12.2017