Выбираемый TextView с inter_word justificationMode - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь сделать выбираемый TextView оправданным, используя justificationMode. Кажется, что эти два свойства не могут сосуществовать, потому что когда я удаляю android:textIsSelectable="true" из TextView, это оправдывается просто отлично. Вот 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 Ответ

3 голосов
/ 29 октября 2019

Android поддерживает только выравнивание в Textview начиная с Oreo, хотя у нас бывают трудные времена для выравнивания текстовых представлений с помощью 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 tv = findviewbyid(R.id.text);
Justify(tv);

И, что самое приятное, оно не ограниченодля Oreo, он будет работать на других более низких версиях Android.

android:textIsSelectable="true"

Выбор текста также будет хорошо работать с этим методом.

...