ilomambo
ilomambo

Reputation: 8350

Android Making a table look like I want

I am having a little bit of trouble making the table look like I intend to. These are a few questions, but since they all refer to the picture below and the details I provide I thought they should all be in a single post.

Here is what I achieved so far:

enter image description here

The header row contains one element of type Button.

    TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);
    mHeader.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
    addView(mHeader);

The rest of the table is poulated like this:
(Messagerow extends TableRow and has a TextView member)

        for(int i = 0; i < 100; i++) {
            MessageRow mr = new MessageRow(getContext());
            // stuff to set the TexView text and color
            mr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
            this.addView(mr);
        }



1. How can I make the header row height be more like the rows?

2. How can I make the button occupy the full width of the row?
If the table is empty, no text rows just header, then the button matches the row width. As soon as I add a row of text, the column width is adapted but the button width is not.

3. How can I make the row fill the screen width? (MATCH_PARENT does not do it)

4. How can I draw a thin line between the table rows?
I tried to override the onDraw() function on MessageRow, but it never gets called, not even once.

Don't get me wrong. I am not asking that you do my work for me. These are issues I tried to solve by myself and googled them and read similar posts, but did not find an answer.
Note: I find that UI design in Javascript for Android lacks clear control and clear documentation over all these little details.

Edit
This is how I create the table:

    TableLayout mTable = new TableLayout(this);

    HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);

    populate(mTable);
    mTable.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    mTable.setBackgroundColor(Color.WHITE);

    hview.addView(mTable);

Upvotes: 1

Views: 916

Answers (2)

user
user

Reputation: 87064

  1. How can I make the header row height be more like the rows?

Using the default Button there isn't much to do. The Button uses a nine-patch image that has some space between the button's text and the borders that you see. You could use a smaller font but that you'll probably look ugly. Another thing to try is using your own background for the Button and get rid of the default extra space(of the default nine-patch image) so the final height is near the height of the text from the TextViews. Or try to enforce a standard height for all rows using a fixed value.

  1. How can I make the button occupy the full width of the row?

I think that you have more then one TextView in MessageRow so when you add the Button it moves to the first column(corresponding to the first TextView). If this is the case, make your Button span across the number of columns representing the number of TextViews in MessageRow:

TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
params.span = 3; // if you have 3 `TextView` in the MessageRow
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);

If this is not the case add more details.

  1. How can I make the row fill the screen width? (MATCH_PARENT does not do it)

As I said on one of your previous questions, I don't know why that happens(but I gave you some solutions there to overcome this issue). Also:

  1. mHeader and the other MessageRow are children of a Tablelayout and the correct LayoutParams to use on them is the LayoutParams of the parent: TableLayout.LayoutParams and not TableRow.LayoutParams.

  2. You add some TextView in the MessageRow(from what I seen in your previous questions), add those child views with TableRow.LayoutParams to MessageRow.

  3. You use only WRAP_CONTENT for your LayoutParams everywhere in your code, you might want to set the width(the first parameter in the constructor) to FILL_PARENT/MATCH_PARENT

  1. How can I draw a thin line between the table rows?

You could use a simple View that will act as a separator:

for(int i = 0; i < 100; i++) {
   MessageRow mr = new MessageRow(getContext());
   // stuff to set the TexView text and color
   mr.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
   this.addView(mr);
   View separator = new View(getContext());
   separator.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, 3)));
   separator.setBackgroundColor(Color.RED);
   this.addView(separator);
}

Because you have 100 rows you could try to set a drawable with a separator line as the background for theTableRow(header and MessageRow) instead of the above method that adds another 100 Views to the layout.

Extra Note:

You have a lot of views to add to a single activity layout, you are talking about 100 rows, and if your MessageRow is more complex than a simple TextView(and I think it is) you could get in some performances problems. I suggest you take a look at the wonderful ListView widget.

Upvotes: 2

Gophermofur
Gophermofur

Reputation: 2101

Don't have a programming environment here, but I'll try and answer some of your questions.

  1. The reason your header row (button) is taller than your test based rows is because the button requires more space and the row accomodates it. The default button has padding on both the top/bottom of the text. I think your best option is to create your own button, which gives you the additional benefit of being able to control the look and feel. It seems like other people have had this issue before: Can't get rid of bottom padding on button

  2. Your button is set to wrap_content which means it won't be any bigger than it needs to be (It will grow/shrink so it can fit the text "Column1" or whatever you put there). Instead of making the Button WRAP, I suspect you'll need to make it FILL_PARENT.

  3. It's not your Table Row that needs to fill the screen width, it's your table that needs to fill the screen. Wherever you define your table, it's probably set to WRAP_CONTENT for the Horizontal dimension. Set it to FILL_PARENT and your table should expand to the full width of whatever it's container is (In this case, it should expand the full width of the screen)

  4. There are probably several different ways you can do this. One method I used somewhat recently is to utilize the View tag which essentially looks like a horizontal bar across the screen. Below is a link to how to implement it. http://sonnygill.net/android/horizontal-rule/

Upvotes: 1

Related Questions