Рассчитайте ширину текста, если она больше ширины textview, а затем обрежьте ее в нужном месте, добавив + x больше текста - PullRequest
0 голосов
/ 23 января 2020

Мне нужно отобразить заголовок экрана со списком имен, разделенных запятыми. Имена могут быть короче или длиннее, но у textview есть android: maxLines = 2. Если список имен длиннее, чем textview, тогда мне нужно установить текст с «+ x More».

If » Лондон, Париж, Нью-Йорк, Сингапур, Гонконг "не могут поместиться в TextView с maxlines 2, тогда мне нужно отобразить" Лондон, Париж, Нью-Йорк +2 Больше ". Это означает, что мне нужно убедиться, что текст, а также Текст «+ x More» вписывается в TextView.

Вот что я пытаюсь сделать:

private void getCommaSeparatedTitle(final String strNames) {
    title.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            title.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            title.setMaxLines(2);
            title.setGravity(Gravity.CENTER_HORIZONTAL);
            title.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                    getResources().getDimension(R.dimen.big_font));
            title.measure(0, 0);

            Paint paint = title.getPaint();
            int textViewWidth = title.getWidth() * 2;

            String[] values = strNames.split(",");
            int i = 0;
            StringBuilder str = new StringBuilder();

            if (paint.measureText(strNames) < textViewWidth)
                title.setText(strNames);
            else {
                String moreText = " +x More";
                for (String name : values) {
                    String temp = str.length() > 0 ? str + ", " + name : name;
                    if (paint.measureText(temp + moreText) < textViewWidth) {
                        str.append(name);
                        str.append(",");
                    } else {
                        title.setText(str + " +" + (values.length - i) + " " + "More");
                        break;
                    }
                    i++;
                }
            }
        }
    });
}

Это определение TextView:

 <com.views.textviews.CustomTextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/medium_margin"
            android:gravity="center_horizontal"
            android:maxLines="2"
            android:textColor="@color/text_color"
            android:textSize="@dimen/big_font"
            android:textStyle="bold" />

Иногда я получаю правильную строку, но иногда она обрезается как

London, Paris, NewYork, Singapore, HongKong => London, "Paris, NewYork, Singap"

London, Paris, NewYork, Singapore, HongKong, Malayasia => "London, Paris, NewYork, Singapore +2mo"

Обратите внимание, что происходит не так. Я думаю, что ширина TextView не правильная, я умножил ее на title.getWidth () * 2, потому что maxLine равен 2. Также не уверен, что гравитация текста вызывает проблему.

Ниже приведены некоторые примеры этой проблемы: enter image description hereenter image description here

...