Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Force texview to wrap content

I have tableview, where create new rows and set them layout manually. In every row there are 3 main elements: image, textview for title and textview for description. To move them where I want, I use two linear layouts. I want textview for description (named as descView) show text in two lines, but instead - it shows only one. What did I do wrong or what method to call, so view shows text in two lines. Would be perfect if it wraps text by word (not char).

Screenshot of what I have now:

enter image description here

Code of creating new row ('New' is Object where I save information (text, image, etc.)):

private TableRow formRow(New item) {

    //prepare table row parameters
    TableRow tr = new TableRow(this);
    tr.setBackgroundResource(R.drawable.results_table_row);
    tr.setVerticalGravity(Gravity.CENTER);
    tr.setTag(item.getTitle());
    tr.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.setBackgroundResource(R.drawable.results_table_row);

            } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
                v.setBackgroundResource(R.drawable.results_table_row_touched);
            }
            return true;
        }
    });


    //create main layout for content
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.HORIZONTAL);

    //add image
    int imageID = Integer.parseInt(item.getPictureSrc());
    ImageView image = new ImageView(this);
    image.setImageResource(imageID);
    image.setPadding(5, 5, 5, 5);
    layout.addView(image);

    //add another layout for title and description
    LinearLayout descLayout = new LinearLayout(this);
    descLayout.setOrientation(LinearLayout.VERTICAL);
    descLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    //add title
    TextView titleView = new TextView(this);
    titleView.setText(item.getTitle());
    titleView.setPadding(5, 0, 0, 0);
    titleView.setTextAppearance(this, R.style.TableRowStyle_ChildTitle);
    titleView.setLines(1);
    descLayout.addView(titleView);

    //add description
    TextView descView = new TextView(this);
    descView.setText(item.getDescription());
    descView.setPadding(5, 0, 0, 0);
    descView.setTextAppearance(this, R.style.TableRowStyle_ChildText);
    descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
    descView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    //descView.setEllipsize(TextUtils.TruncateAt.END);
    descView.setLines(2);
    descLayout.addView(descView);

    //add description layout to main layout
    layout.addView(descLayout);

    //finally, add layout to row
    tr.addView(layout);

    return tr;
}
like image 526
Paulius Vindzigelskis Avatar asked Apr 16 '26 07:04

Paulius Vindzigelskis


1 Answers

I have a similar setup like this for some of my applications, but personally, with something like that, I would scrap the 2 LinearLayouts and use a single RelativeLayout for this, and I would try getting rid of:

descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
descView.setLines(2);

Then I would position the items relatively to each other and the sides with a Width of that TextView set to FILL_PARENT and its height to WRAP_CONTENT.

You could get a much more uniform appearance for that with a RelativeLayout:

Set the ImageView with ALIGN_PARENT_LEFT, give it a margin of x-dip on the right and left.

Then add your Title TextView and align it to the RIGHT of the ImageView.

Then add your Description TextView and align it to the RIGHT of the ImageView and BELOW the Title.

Since you're doing it through code though, I would go even one step further since it looks like they're both the same font style (title is just bolded) and make it a single TextView for both title/description, then just use:

 textView.setText(Html.fromHtml("<b>" + item.getTitle() + "</b><br>" + item.getDescription())); 

Just make sure you give everything a unique ID to link to, and don't align to something that hasn't been displayed yet or you'll throw a NPE or it just won't display right at all.

But yeah, I'll use a RelativeLayout for listing items with multiple components over a LinearLayout any day.

Hope it helps~

like image 76
Cruceo Avatar answered Apr 17 '26 21:04

Cruceo