simekadam
simekadam

Reputation: 7384

Why I'm getting different results when running TextView.measure() in code, from what I see rendered on screen

I'm now trying to resolve an issue with somehow overlapping text in TextView. I've posted a question about that , but I've also tried to solve it myself. I decided to count the amount of text which causes the textview to break the line. I came up with this unpolished code, which basically should inflate the view, set it's layout params according to the displayed size and then run onmeasure and return lineCount. I plan than to use probably binary search to find exact text length which fits into the textview, but even before I've just tried to run the code and see how it behaves. It's kind of weird, because it gives me different results, than what I see on screen than. I even tried to alter the textsize according to scaled density, because I wasn't sure whether it's been taken into account.

Here is the code. It returns three,but when I render the layout to screen the text takes up only two lines.

public int getCountOfLines(Context context, int widgetDp){

    LayoutInflater mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout layout = (LinearLayout) mLayoutInflater.inflate(R.layout.event_basic_large ,null, false);

    TextView titleTextView = (TextView) layout.findViewById(R.id.itemTitle);
    titleTextView.setText(TEST_TEXT);

    float density = context.getResources().getDisplayMetrics().density;
    float textDensity = context.getResources().getDisplayMetrics().scaledDensity;

    titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleTextView.getTextSize()/density*textDensity);

    layout.setLayoutParams(
            new LinearLayout.LayoutParams(
                    (int) (widgetDp*density),
                    ViewGroup.LayoutParams.WRAP_CONTENT)
    );


    layout.measure(View.MeasureSpec.makeMeasureSpec(
            (int) (widgetDp*density), View.MeasureSpec.EXACTLY),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    );

    Log.d(TAG, titleTextView.getLineCount() + " lines, width "+titleTextView.getMeasuredWidth());


    return titleTextView.getLineCount();
}

Upvotes: 1

Views: 170

Answers (1)

vipul mittal
vipul mittal

Reputation: 17401

I ran into this a while back and after searching and trying finally got the following function to work:

public int getLineCount(String testString, float textSize, 
        float width) {
    Rect bounds = new Rect();
    Paint paint = new Paint();
    paint.setTypeface(<font>);//set font that you are using for this
    paint.setTextSize(textSize);
    paint.getTextBounds(testString, 0, testString.length(), bounds);

    return (int) Math.ceil(bounds.width() / width);
}

This function uses textSize and width to give number of lines. This functions give number of line in a textview before it is displayed.

Upvotes: 1

Related Questions