Установить стиль на TableRow в Android - PullRequest
7 голосов
/ 17 июля 2009

Используя Android SDK, кажется, нет способа установить стиль в строке таблицы. Я хочу сделать эквивалент:

<TableRow
    style='@style/TableRow_classic' >

в коде. Я хотел бы что-то вроде:

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

Кто-нибудь знает, как это найти?

Ответы [ 3 ]

12 голосов
/ 08 октября 2011

Лучшее решение, которое я нашел для достижения этой цели, - это создать «частичный» макет, представляющий строку таблицы, с определенным стилем:

<?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" />

Затем накачайте его в своем коде, чтобы использовать динамически:

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

Хотя это и не идеально, у меня это работает

3 голосов
/ 02 августа 2009

Насколько я могу судить, метода setStyle не существует. Вы могли бы пройти и установить каждое отдельное свойство, но это противоречит цели отделения вашего View от логики вашего контроллера. Bad.

Кто-нибудь разобрался, как динамически назначать стили?

1 голос
/ 25 сентября 2010

Я пытаюсь установить свойства стиля, полученные из моей Темы, в коде.

Моя причина в том, что я хочу использовать стиль из моей собственной Темы, НО мой макет пользовательского интерфейса полностью генерируется в коде (с использованием пользовательского компоновщика макетов), без определения каких-либо виджетов в XML. Поэтому я не могу установить стиль в макете XML моего виджета - здесь нет макета XML.

Я думаю, что смогу установить этот стиль в коде моего виджета, используя

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

Здесь (мне) кажется, что

  1. AttributeSet set = null;, потому что это то, что предоставил бы инфлятор XML.

  2. int[] attrs = R.styleable.MyWidget; определяет, какие атрибуты я хочу посмотреть.

  3. int defStyleAttr = myWidgetStyle;, который является ссылкой, определенной в моей теме, на стиль для MyWidget. Они оба определены в файлах XML в res / values. «MyWidgetStyle» следует шаблону имени, который разработчики Android использовали в своем коде.

  4. defStyleRes = 0; Я надеюсь, что мне не нужно об этом думать.

Затем получить любое свойство, например цвет фона,

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

a.recycle();

Это, кажется, работает - так или иначе, так далеко.

Кажется, что система сборки Android удобно генерирует правильный индекс для использования в a.getColor и называет его R.styleable.MyWidget_background. Я не сделал это имя, поэтому Android, должно быть, сделал это, используя мой XML для моего стиля MyWidget.

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

Don

...