如何使TextInputLayout提示所需字段的星号为红色

当使用设计支持库中的TextInputLayout时,是否可以在提示中只显示星号? 我已经看到了关于样式整个提示的信息,但这有点复杂,因为只有*应该是红色,而不是整个消息。

Material Design示例显示了这一点,但设计库似乎没有任何选项可以使用TextInputLayout和EditText以这种方式设置样式。

参考: https : //www.google.com/design/spec/components/text-fields.html#text-fields-required-fields

示例(顶部,有焦点,有红色星号;没有焦点的底部没有红色星号):

带有红色星号的提示文本示例

我查看将提示设置为一个SpannableString(请参阅此处如何在条目中获取红色星号 )在OnFocusChangeListener中(请参阅此处在textinputlayout内部具有编辑文本(红色星号)的必需符号 ) ,但提示是CharSequence。

有没有办法在不扩展TextInputLayout的情况下做到这一点?

Material Design为必需字段指定一个星号,该字段是提示文本的一部分,并且颜色相同(不是您在问题中显示的红色)。

在Kotlin这很简单:

1.定义这个扩展方法:

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

2.使用它:

 input_first_name.markRequired() 
   

改变你的主题colorAccent,看看

你能从Html中添加一个跨区字符串吗?

  String grey = "Legal first name*"; Spanned redStar; String html = "Legal first name*"; 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); } 

通过添加包含在html中的postfix来更改TextInputLayout提示:

 public void setRequired(boolean required) { componentField.setHint( TextUtils.concat( componentField.getHint(), Html.fromHtml( getContext().getString( R.string.required_asterisk)))); } 

星号代码应该存储在android strings.xml中以便正确转义:

 &nbsp*]]> 

是的它可能,因为我在我当前的应用程序中做同样的事情。 而对于焦点和无焦点,你必须做一些逻辑来删除星号。

 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); 

我经历了同样的过程,它对我有用

  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; }