Подтвердить что ты не робот

Как сделать TextInputLayout намекнуть звездочку красным на обязательные поля

Возможно ли сделать только звездочку в подсказке красного цвета при использовании TextInputLayout из библиотеки поддержки дизайна? Я видел информацию о стилизации всего намека, но это немного сложнее, поскольку только * должен быть красным, а не всем сообщением.

Пример Material Design показывает это, но библиотека дизайна, похоже, не имеет возможности стилизовать его таким образом, используя TextInputLayout и EditText.

Ссылка: https://www.google.com/design/spec/components/text-fields.html#text-fields-required-fields

Пример (сверху, с фокусом, есть красная звездочка, внизу без фокуса нет красной звездочки):

Пример текста подсказки с красной звездочкой

Я рассмотрел настройку подсказки на SpannableString (см. здесь Как получить красную звездочку в записи <string> ) в OnFocusChangeListener (см. здесь Наличие обязательного символа для текста редактирования (звездочка красного цвета), который находится внутри textinputlayout), но подсказка - CharSequence.

Есть ли способ сделать это без расширения TextInputLayout?

4b9b3361

Ответ 1

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/black</item>
</style>

измените тему colorAccent и посмотрите

Ответ 2

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

В Котлине это очень просто:

1. Определите этот метод расширения:

fun TextInputLayout.markRequired() {
    hint = "$hint *"
}

2. Используйте его:

input_first_name.markRequired()

Ответ 3

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

String mm = "Legal first name";
Spannable WordtoSpan = new SpannableString(mm);
WordtoSpan.setSpan(
        new ForegroundColorSpan(Color.parseColor("#e62e6c")), 
        16, 
        mm.length(), 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
WordtoSpan.setSpan(new RelativeSizeSpan(0.9f), 16, mm.length(), 0);
view.setText(WordtoSpan);

Ответ 4

Я прошел через один и тот же процесс, и это сработало для меня

 TextView text = (TextView) rootView.findViewById(R.id.name_textview);

 SpannableStringBuilder builder1 = setStarToLabel("Name");

 text.setText(builder1);

  @NonNull
private SpannableStringBuilder setStarToLabel(String text) {
    String simple = text;
    String colored = "*";
    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append(simple);
    int start = builder.length();
    builder.append(colored);
    int end = builder.length();
    builder.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return builder;
}

Ответ 5

Не могли бы вы добавить строку из Html?

   String grey = "Legal first name*";
   Spanned redStar;
   String html = "<string style="color:grey;">Legal first name<span style="color:red;">*</span></string>";

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
   redStar = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
   } else {
   redStar = Html.fromHtml(html);
   }

И измените намек на фокус.

   textInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
   public void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus)
        myEditText.setHint(redStar.toString);
    else
        myEditText.setHint(grey);
}

Ответ 6

Измените подсказку TextInputLayout, добавив postfix, заключенный в html:

public void setRequired(boolean required) {

  componentField.setHint(
    TextUtils.concat(
      componentField.getHint(),
      Html.fromHtml(
        getContext().getString(
          R.string.required_asterisk))));
}

Код Asterisk должен храниться в файле android strings.xml для правильного экранирования:

<string name = "required_asterisk"><![CDATA[<font color=\'#cc0029\'>&nbsp*</font>]]></string>