Set style on TableRow in Android

16,198

Solution 1

The best solution I've found to accomplish this is to create a "partial" layout representing the table row, with a style defined:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    style="@style/tr_withborder" />

Then inflate it in your code, to use dynamically:

TableRow tr = (TableRow) getLayoutInflater().inflate(R.layout.partial_table_row, null);

While not ideal, it does work for me

Solution 2

As far as I can tell, there is no setStyle method. You could go through and set each individual property, but that defeats the purpose of separating your View from your controller logic. Bad.

Has anyone figured out how to dynamically assign styles?

Solution 3

I am trying myself to set style properties obtained from my Theme in code.

My reason is that I want to use a style from my own Theme, BUT my User Interface Layout is entirely generated in code( using a custom layout builder), without defining any widgets in XML. So I cannot set a style in the XML layout of my widget – there isn’t any XML layout.

I am thinking that I will be able to set this style in the code of my widget by using

TypedArray a = context.obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)

Here it seems (to me) that

  1. AttributeSet set = null; because this is what the XML inflater would have provided.

  2. int[] attrs = R.styleable.MyWidget; defines what attributes I want to look at.

  3. int defStyleAttr = myWidgetStyle; which is a reference, defined in my Theme, to a style for MyWidget. These are both defined in XML files in res/values. “myWidgetStyle” follows the pattern of name the android developers have used in their code.

  4. defStyleRes = 0; I am hoping that I don’t need to think about this.

Then to get any property , such as a background color,

Color  color = a.getColor(R.styleable.MyWidget_background,  R.color.my_default);

a.recycle();

This does seem to work –so far anyway.

It seems that the android build system conveniently generates the correct index to use in a.getColor, and names it R.styleable.MyWidget_background . I didn’t make this name, so Android must have done it using my XML for my styleable MyWidget.

I expect one can look up the correct index by searching the TypedArray for the required attribute , but that would be inefficient and the TypedArray looks like an unpleasant contraption to deal with. I would use a very long stick to poke it!

Don

Share:
16,198
stevedbrown
Author by

stevedbrown

Planner, refactorer, coder, scrum runner.

Updated on July 18, 2022

Comments

  • stevedbrown
    stevedbrown almost 2 years

    Using the Android SDK, there doesn't seem to be any way to set the style on a table row. I want to do the equivalent of:

    <TableRow
        style='@style/TableRow_classic' >
    

    in code. I would like something like:

    TableRow row = new TableRow(this);
    row.setStyle(R.style.TableRow_classic);
    

    Does anyone know how to find this?