带有inter_word justificationMode的可选TextView

时间:2019-10-29 01:06:54

标签: java android android-layout textview androidx

我正在尝试使用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。

1 个答案:

答案 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"

文本选择也可以使用此方法。