2014-02-13 3 views
1

У меня есть пользовательская группа просмотра, которая содержит пару простых видов. Как я могу создать стиль своей группы представлений, чтобы определенные свойства достигали определенных дочерних элементов? Например, в следующем примере, как я могу создать стиль, который позволяет легко изменять размер текста, цвет и т. Д. Я хотел бы установить стиль в xml в CustomViewGroup, если это вообще возможно. Можно ли указать идентификатор при создании стилей, чтобы его получить?Android Style Custom ViewGroup

Пример использования:

<com.example.CustomViewGroup 
    android:id="@+id/custom" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

XML из представления группы:

<TextView 
     android:id="@+id/valueTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/descriptionTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/valueTextView" 
     android:layout_alignLeft="@id/valueTextView" 
     android:layout_marginTop="-4dip" 
     android:layout_marginLeft="26dip"/> 


</RelativeLayout> 

Если стиль для этой точки зрения было то же самое все время это не было бы проблемой, но я бы например, использовать разные стили в разных ситуациях, поэтому я могу иметь больше в некоторых областях моего приложения, но меньше в других.

Заранее благодарен!

+1

Попробуйте сделать некоторые пользовательские атрибуты (ссылку на формат) для каждого из основных дочерних представлений, вы будете использовать эти атрибуты в 'CustomViewGroup'. Затем назначьте соответствующие стили этим атрибутам и примените их в конструкторе 'CustomViewGroup' к нужным детям. – Luksprog

+0

Спасибо @Luksprog, это привело меня к правильному пути. См. Мой ответ ниже, если вы хотите увидеть, как я это сделал – StackJP

ответ

0

Основываясь на комментарии от @Luksprog, я смог спуститься по пути, который привел к не столь совершенному, но не уродливому, достаточному, чтобы я-ненавижу решение.

не Поскольку я было создание и добавление взглядов в моем конструкторе ViewGroup и надувать из файла XML я не мог просто добавить атрибуты, которые ссылаются на стили (см this). Поэтому я создал атрибут enum, который переключается между различными стилями, которые я мог бы захотеть для этого представления. Затем в конструкторе я раздувал разные макеты (где стили были установлены в xml) на основе этого атрибута.

Пример:

public CustomViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initialize(context, attrs, defStyleAttr); 
    } 

    private void initialize(Context context, AttributeSet attrs, int defStyleAttr) { 
     if (attrs != null) { 
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomViewGroup, defStyleAttr, 0); 

      int style = a.getInt(R.styleable.CustomViewGroup_styleType, 0); 
      switch (style) { 
       case 0: 
        View.inflate(context, R.layout.custom_view_group_small, this); 
        break; 
       case 1: 
        View.inflate(context, R.layout.custom_view_group_large, this); 
        break; 
       default: 
        View.inflate(context, R.layout.custom_view_group_large, this); 
        break; 
      } 

      ... 
     } 
    } 

Опять не самое элегантное решение, но его работа для меня, и теперь я могу обновить стили довольно легко, без необходимости менять кучу файлов.