TextView последняя линия нарисована пополам - PullRequest
0 голосов
/ 31 августа 2011

У меня есть TextView, высота которого является динамической.Я хочу установить, что последняя линия не будет видна, если она не может быть нарисована полностью. снимок экрана

Причина, по которой высота является динамической, заключается в том, что она используется в AppWidget, а размер приложения не одинаков на разных устройствах.Из-за этого вы не можете измерить TextView или не можете использовать подкласс TextView. ссылка

Это то, что я сейчас использую в основном.Когда я помещаю длинный текст в TextView, последняя строка выглядит ужасно.

<LinearLayout
android:id="@+id/widgetContent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
    android:id="@+id/sg"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>

Ответы [ 6 ]

5 голосов
/ 21 декабря 2012

Я недавно столкнулся с этой проблемой и использовал другое решение.

Я устанавливаю maxLines динамически:

final TextView tv = ((TextView) myLayout.findViewById(R.id.mytextview));
tv.setText(value);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    private int maxLines = -1;

    @Override
    public void onGlobalLayout() {
        if (maxLines < 0 && tv.getHeight() > 0 && tv.getLineHeight() > 0) {
            int height = tv.getHeight();
            int lineHeight = tv.getLineHeight();
            maxLines = height / lineHeight;
            tv.setMaxLines(maxLines);
        }
    }
});
3 голосов
/ 31 августа 2011

Попробуйте это

Paint  paint = new Paint();
// set paint with all current text properties of the textview. like text size, face etc,

textPixelLenght = paint.measureText(mText);
int textviewWidth = mTextView.getMeasuredWidth();
int numberOfLines = textPixelLenght /textviewWidth;;

int textlineHeight = textview.getLineHeight ();
if (textlineheight * numberOfLines > textviewHeight) {
    // text going beyond textviews height. Ellipsize the text using
    // TextUtils.ellipsize(params);     
} 
1 голос
/ 31 августа 2011

Вам нужно знать расстояние между шрифтами -

т. Е. Если вы знаете, что по 20 символов в строке и каждая полная строка имеет высоту 10px, вам следует динамически назначать текст TextView:

String toAdd = "";
for (int i=0; i < textViewHeight; i+= textHeight) 
    toAdd += fullText.subString(i, i+charactersPerLine);
0 голосов
/ 19 ноября 2012

Это решение удваивает проход измерения, но поскольку это текстовое представление без дочерних элементов, влияние не должно быть слишком большим.Это также не поможет с виджетом, так как это пользовательский вид текста.Извините!

public class ExactWrappingTextView extends TextView{

public ExactWrappingTextView(Context context) {
    super(context);
}
public ExactWrappingTextView(Context context, AttributeSet attrs){
    super(context, attrs);
}
public ExactWrappingTextView(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
}

private int measureHeight;
private int extraSpace;

//This doubles the measure pass for this view... but we have to know how 
    //high it would have been before we can pull off the right amount
public void onMeasure(int width, int height){
    super.onMeasure(width, height);
    extraSpace = (getMeasuredHeight() - (getPaddingTop() + getPaddingBottom())) % getLineHeight();
    measureHeight = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - extraSpace, MeasureSpec.AT_MOST);
    super.onMeasure(width, measureHeight);
}

}

0 голосов
/ 31 августа 2011

Используя высоту шрифта, динамически изменяйте высоту представления, т.е.

Если ваш текст имеет высоту 10px, ваш TextView может иметь высоту только 10, 20, 30px.Это не требует наличия определенного стиля шрифта.

0 голосов
/ 31 августа 2011

Решением вашей проблемы будет создание пользовательского TextView и переопределение метода onDraw () TextView. Там вы можете управлять тем, как этот TextView обрабатывает этот случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...