Android开发:如何实现提示文本正常、输入文本加粗?
解决EditText输入文本加粗、提示文本正常的问题
直接给EditText设置android:textStyle="bold"会同时影响输入文本和提示文本,因为提示文本默认继承EditText的文本样式,你之前给string资源加style的方式无效,是因为EditText的样式优先级更高。下面提供两种可行方案:
方案一:通过TextWatcher动态设置输入文本样式
- XML布局中定义EditText,不设置全局textStyle:
<EditText android:id="@+id/editTextPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/password_hint" />
对应的string资源保持普通格式:
<string name="password_hint">Password</string>
- 在代码中添加文本变化监听,当有输入时给文本设置加粗样式:
EditText editText = findViewById(R.id.editTextPassword); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { SpannableString spannable = new SpannableString(s); spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); editText.setText(spannable); editText.setSelection(s.length()); // 保持光标在文本末尾 } } @Override public void afterTextChanged(Editable s) {} });
方案二:自定义EditText重写绘制逻辑
适合需要全局复用该样式的场景:
public class BoldInputEditText extends EditText { public BoldInputEditText(Context context) { super(context); init(); } public BoldInputEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BoldInputEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 设置输入文本默认加粗 setTypeface(getTypeface(), Typeface.BOLD); } @Override protected void onDraw(Canvas canvas) { Paint paint = getPaint(); paint.save(); // 强制提示文本使用正常样式 paint.setTypeface(Typeface.DEFAULT); // 绘制提示文本 super.onDraw(canvas); // 恢复画笔样式,保证输入文本仍为加粗 paint.restore(); } }
在XML中使用自定义EditText:
<com.yourpackagename.BoldInputEditText android:id="@+id/editTextPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/password_hint" />
内容的提问来源于stack exchange,提问作者biipek
相关产品推荐
相关产品推荐

