デザインサポートライブラリのTextInputLayoutを使用するときに、ヒントのアスタリスクだけを赤にすることは可能ですか?ヒント全体のスタイリングに関する情報を見てきましたが、メッセージ全体ではなく*のみが赤である必要があるため、これはもう少し複雑です。
マテリアルデザインの例はこれを示していますが、デザインライブラリには、TextInputLayoutとEditTextを使用してこのようにスタイルを設定するオプションがないようです。
リファレンス: https://www.google.com/design/spec/components/text-fields.html#text-fields-required-fields
例(フォーカスのある上部には赤いアスタリスクがあり、フォーカスのない下部には赤いアスタリスクがありません):
OnFocusChangeListenerでSpannableString(ここで <string>エントリで赤いアスタリスクを取得する方法 )にヒントを設定することを検討しました(ここで 編集テキストへの必須シンボルの保持) (赤い色のアスタリスク)これはtextinputlayout )内にありますが、ヒントはCharSequenceです。
TextInputLayoutを拡張せずにこれを行う方法はありますか?
マテリアルデザインでは、ヒントテキストの一部であり、同じ色(質問で示したように赤ではない)の必須フィールドにアスタリスクを指定します。
Kotlinでは、これは本当に簡単です。
1.この拡張メソッドを定義します:
fun TextInputLayout.markRequired() {
hint = "$hint *"
}
2.使用する:
input_first_name.markRequired()
マテリアルデザインガイドラインで推奨されていないにもかかわらず、まだアスタリスクが必要な場合は、AndroidX Core KTXをそのまま使用できます。
fun TextInputLayout.markRequiredInRed() {
hint = buildSpannedString {
append(hint)
color(Color.RED) { append(" *") } // Mind the space prefix.
}
}
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);
}
<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>
テーマの色を変更する
Htmlでラップされた接尾辞を追加して、TextInputLayoutヒントを変更します。
public void setRequired(boolean required) {
componentField.setHint(
TextUtils.concat(
componentField.getHint(),
Html.fromHtml(
getContext().getString(
R.string.required_asterisk))));
}
アスタリスクコードは、正しくエスケープするためにAndroid strings.xmlに保存する必要があります。
<string name = "required_asterisk"><![CDATA[<font color=\'#cc0029\'> *</font>]]></string>