EditText のテキストを複数の色にしようとしています。例えば、私の文章が「今日はいい日です」の場合、「それは」の部分を緑、残りを赤にすることはできますか?
5 に答える
そのようなものを使用して、色の一部を緑色にします。
final String text = "Some Text";
Spannable modifiedText = new SpannableString(text);
modifiedText.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.green)), 0, lengthYouWant, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(modifiedText);
スパナブルを使用できます。
Spannable spannable = yourText.getText();
spannable .setSpan(new BackgroundColorSpan(Color.argb(a, r, g, b)), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
私もこんな悩みを抱えています。数時間後、私はそれを処理する方法を見つけました:
mYourTextView.addTextChangedListener(new TextWatcher() {
private String oldContent = "";
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
final String newContent = mYourTextView.getText().toString();
if (newContent.length() > 10 && !oldContent.equals(newContent)) {
oldContent = newContent;
mYourTextView.setText(Html.fromHtml(
String.format("%s", "<font color='#000000'>" + newContent.substring(0, 10) + "</font>")
+ "<font color='#ff0000'>" + newContent.substring(10, newContent.length()) + "</font>"));
Log.d("onTextChanged", "Start : " + start);
//move cursor after current character
mYourTextView.setSelection(start + 1 > mYourTextView.getText().toString().length()
? start : start + 1);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
このコードは、最初の 10 文字を黒色にし、その後の文字を赤色にします。EditText が setText() を呼び出してから onTextChanged を呼び出すと、無限ループを防ぐために変数 oldContent が必要になります。
はい。Spannable
オブジェクト ( または のいずれSpannedString
か)を作成し、SpannedStringBuilder
その上にスパンを設定して、求める色を適用する必要があります。
たとえば、このサンプル プロジェクトの次のメソッドは、 の内容をTextView
取得し、ユーザーが入力した文字列を検索し、すべての出現箇所を紫色の背景色でマークアップして、以前のマーカーをすべて削除します。
private void searchFor(String text) {
TextView prose=(TextView)findViewById(R.id.prose);
Spannable raw=new SpannableString(prose.getText());
BackgroundColorSpan[] spans=raw.getSpans(0,
raw.length(),
BackgroundColorSpan.class);
for (BackgroundColorSpan span : spans) {
raw.removeSpan(span);
}
int index=TextUtils.indexOf(raw, text);
while (index >= 0) {
raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index
+ text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index=TextUtils.indexOf(raw, text, index + text.length());
}
prose.setText(raw);
}
あなたの場合、前景色を変更すると、 のForegroundColorSpan
代わりにが使用されますBackgroundColorSpan
。
では、ユーザーがテキストを編集できるという点で少し注意EditText
が必要です。また、必要なルールを満たすためにフラグを選択する必要があります。たとえば、次のようにSpanned.SPAN_EXCLUSIVE_EXCLUSIVE
なります。
- スパン領域の中央に入力された文字は、スパンの効果 (前景色など) を取得します。
- スパン領域の直前または直後に入力された文字は、スパン領域の外側と見なされるため、スパンの効果が得られません。