我正在尝试使用justificationMode使可选择的TextView对齐。
似乎这两个属性不能并存,因为当我从TextView中删除android:textIsSelectable="true"
时,它就可以了。
这是TextView:
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/sf_reg"
android:padding="16dp"
android:textIsSelectable="true"
android:justificationMode="inter_word"
android:gravity="left|top"
android:textColor="@android:color/black"
android:textSize="15sp" />
我正在使用androidx.appcompat:appcompat:1.1.0
,targetSdkVersion为29,minSdkVersion为26。
答案 0 :(得分:3)
自奥利奥(Oreo)以来,Android仅支持Textview的完全对正,尽管我们很难用justificationMode对文本视图进行对正。 但是,您可以通过在类中编写一个简单的方法来实现裁判。
public void Justify(final TextView textView) {
final AtomicBoolean isJustify = new AtomicBoolean(false);
final String textString = textView.getText().toString();
final TextPaint textPaint = textView.getPaint();
final SpannableStringBuilder builder = new SpannableStringBuilder();
textView.post(new Runnable() {
@Override
public void run() {
if (!isJustify.get()) {
final int lineCount = textView.getLineCount();
final int textViewWidth = textView.getWidth();
for (int i = 0; i < lineCount; i++) {
int lineStart = textView.getLayout().getLineStart(i);
int lineEnd = textView.getLayout().getLineEnd(i);
String lineString = textString.substring(lineStart, lineEnd);
if (i == lineCount - 1) {
builder.append(new SpannableString(lineString));
break;
}
String trimSpaceText = lineString.trim();
String removeSpaceText = lineString.replaceAll(" ", "");
float removeSpaceWidth = textPaint.measureText(removeSpaceText);
float spaceCount = trimSpaceText.length() - removeSpaceText.length();
float eachSpaceWidth = (textViewWidth - removeSpaceWidth) / spaceCount;
SpannableString spannableString = new SpannableString(lineString);
for (int j = 0; j < trimSpaceText.length(); j++) {
char c = trimSpaceText.charAt(j);
if (c == ' ') {
Drawable drawable = new ColorDrawable(0x00ffffff);
drawable.setBounds(0, 0, (int) eachSpaceWidth, 0);
ImageSpan span = new ImageSpan(drawable);
spannableString.setSpan(span, j, j + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
builder.append(spannableString);
}
textView.setText(builder);
isJustify.set(true);
}
}
});
}
然后在方法内传递textview,
Textview tv = findviewbyid(R.id.text);
Justify(tv);
也是最好的部分,它不仅限于Oreo,它将在其他较低版本的android上运行。
android:textIsSelectable="true"
文本选择也可以使用此方法。