使用设计支持库中的TextInputLayout时,是否可以在提示中只显示星号?我已经看到了关于样式整个提示的信息,但这有点复杂,因为只有*应该是红色,而不是整个消息。
Material Design示例显示了这一点,但设计库似乎没有任何选项可以使用TextInputLayout和EditText以这种方式设置样式。
参考: https://www.google.com/design/spec/components/text-fields.html#text-fields-required-fields
示例(顶部,有焦点,有红色星号;没有焦点的底部没有红色星号):
我研究了在OnFocusChangeListener中将提示设置为SpannableString(请参阅此处How to get a red asterisk in a <string> entry)(请参阅此处Having the mandatory symbol to the edit text (red color asterisk) which is inside the textinputlayout),但提示是CharSequence。
有没有办法在不扩展TextInputLayout的情况下执行此操作?
答案 0 :(得分:9)
材质设计为所需字段指定一个星号,该字段是提示文本的一部分,并且颜色相同(不是您在问题中显示的红色)。
在Kotlin中,这非常简单:
1.定义此扩展方法:
fun TextInputLayout.markRequired() {
hint = "$hint *"
}
2.使用它:
input_first_name.markRequired()
如果仍然希望星号为红色,尽管不受Material Design准则的劝阻,您可以这样使用AndroidX Core KTX:
fun TextInputLayout.markRequiredInRed() {
hint = buildSpannedString {
append(hint)
color(Color.RED) { append(" *") } // Mind the space prefix.
}
}
答案 1 :(得分:4)
您可以使用材料成分库。
从1.2.0-alpha05
开始,您可以设置提示文本的格式。
例如,您可以使用类似以下的内容:
<com.google.android.material.textfield.TextInputLayout
android:hint="@string/hint_test"
...>
具有:
<string name="hint_test">Legal name <font fgcolor='#FF0000'>*</font></string>
答案 2 :(得分:2)
<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并查看
答案 3 :(得分:2)
你可以在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);
}
答案 4 :(得分:0)
通过添加包含在html中的后缀来更改TextInputLayout提示:
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\'> *</font>]]></string>
答案 5 :(得分:0)
这对我有用
textinputlayout.setHint(Html.fromHtml("Project Title <font color =\"#cc0029\" >*</font>"));
答案 6 :(得分:-1)
是的可能,因为我在我当前的应用程序中做同样的事情。对于焦点和无焦点,你必须做一些逻辑来删除星号。
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);
答案 7 :(得分:-1)
我经历了同样的过程,它对我有用
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;
}