2013-03-08 8 views
3

У меня есть пользовательский вид, определенный этим XMLатрибут Android XML ссылается другой атрибут XML того же типа

(часть)

<LinearLayout style="@style/LayoutVertWrapContent.SameWidth" 
    android:layout_weight="2" 
    android:layout_marginRight="?betweenElementsPadding"> 

    ... 
    some inner views 
    ... 

</LinearLayout> 

<LinearLayout style="@style/LayoutVertWrapContent.SameWidth" 
    android:layout_weight="2" 
    android:layout_marginRight="?betweenElementsPadding"> 

    ... 
    some inner views 
    ... 

</LinearLayout> 

Для этой точки зрения я объявил некоторые атрибуты:

<declare-styleable name="TheView"> 
    ... 
    <attr name="betweenElementsPadding" format="dimension" /> 
</declare-styleable> 

Как я могу объявить этот вид в макете xml для действия и передать междуElementsPadding, так что android:layout_marginRight="?betweenElementsPadding" из XML-файла вида?

<com.blablabla.TheView 
     android:id="@+id/date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     dct:betweenElementsPadding="@dimen/background_padding" /> 

Желаемый результат android:layout_marginRight для обоих LinearLayouts установлен в betweenElementsPadding.

UPDATE 1

Для предотвращения дальнейших недоразумений, я хочу иметь униформу способа изменения ДКПА: betweenElementsPadding, скажет

<com.blablabla.TheView 
     android:id="@+id/date_1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     dct:betweenElementsPadding="3dp" /> 

<com.blablabla.TheView 
     android:id="@+id/date_2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     dct:betweenElementsPadding="15dp" /> 

<com.blablabla.TheView 
     android:id="@+id/date_3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     dct:betweenElementsPadding="25dp" /> 

и в каждом из этих случаев я хочу LinearLayout .layout_marginRight будет установлено точное значение dct: betweenElementsPadding, который является 3dp, 15dp и 25dp, начиная с первого.

ОБНОВЛЕНИЕ 2

Используя обходной путь, частично предложенный Джо. В стиле конструктора пользовательского вида я делаю это:

// set betweenElementsPadding 
final int betweenElementsPadding = array.getDimensionPixelSize(R.styleable.TheView_betweenElementsPadding, 0); 
((LinearLayout.LayoutParams)((LinearLayout)findViewById(R.id.layout_1)).getLayoutParams()).rightMargin = betweenElementsPadding; 
((LinearLayout.LayoutParams)((LinearLayout)findViewById(R.id.layout_2)).getLayoutParams()).rightMargin = betweenElementsPadding; 

Но я не нашел ответа на мой первоначальный вопрос о том, как сделать то же самое только с XML.

ответ

0

Почему бы не использовать:

<style name="LayoutVertWrapContent.SameWidth" parent="someOtherStyleIfYouWant"> 
    <item name="android:layout_marginRight">@dimen/background_padding</item> 
    <item name="android:layout_weight">2</item> <!-- if the same in all --> 
</style> 

без смешивания атрибутов?


Edit:

Это link может быть полезным, а также я думаю, что использование xmlns:dct="http://schemas.android.com/apk/res-auto" поможет с признанием dct:betweenElementsPadding в вашем XML.

<com.blablabla.TheView 
     xmlns:dct="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     dct:betweenElementsPadding="@dimen/background_padding" /> 
+0

Извините. Это не помогает. Я хочу иметь унифицированный способ изменения атрибута при объявлении представления в макете XML. Посмотрите: ' .... .' и т. д., и в каждом из этих случаев я устанавливаю ** между ElementsPadding **, и я хочу ** layout_marginRigh ** для LinearLayouts ** TheView ** автоматически изменять это значение. Вы предлагаете мне объявить ** stlye ** для каждого нового отдельного значения ** междуElementsPadding **. –

+0

Нет в этом случае, возможно, это не так полезно ... но если вы хотите только объявить 'layout_marginRight', я все еще не могу найти использование записи' dct: betweenElementsPadding = sth' вместо 'layout_marginRight = sth' – madlymad

+0

Пожалуйста, проверьте обновления в вопросе выше. В нескольких словах ваш подход не будет работать, потому что я хочу объявить несколько пользовательских представлений с разными 'layout_marginRight' для каждого из них. Учтите, что 'layout_marginRight' находится не в XML-макете активности, а в глубине XML-файла настраиваемого представления, к которому я не хочу прикасаться. –

0

Я бы порекомендовал dimens.xml. Вы можете ссылаться на них, чтобы делать такие вещи, как дополнение к левому/правому/верхнему/нижнему вложений в приложении. Вы также можете делать такие вещи, как использовать Views/ViewGroups (FrameLayout, например) для заполнения

Я думаю, вам также может потребоваться передать атрибуты XML в пользовательский вид.В конструкторе вашего представления есть параметр attrs, плюс команды для получения таких атрибутов, как getStyledAttributes

+0

Первая часть вашего предложения я не понимаю. –

+0

Что касается второй части, вы имеете в виду, что я мог бы анализировать параметры attrs в конструкторе пользовательского вида и проксировать эти параметры с соответствующими параметрами базовых представлений? Что-то вроде: 'final float p = attr.getDimension (R.dimen.TheView_betweenElementsPadding, 0); MyLinearLayout.getLayout(). RightMargin = p; '? Если вы имели в виду это, я тоже подумал об этом, но я хочу найти простой способ сделать XML-атрибут, чтобы получить значение другого атрибута XML, просто отредактировав XML и не трогая код. Я не могу поверить, что нет никакого способа сделать это. –

+1

Извините. В первой части я подумал, что это обычные, нестандартные взгляды. В этом случае вы можете создавать значения в dimens.xml, чтобы воспользоваться преимуществами «изменить его в одном месте, а отступы меняются во всех местах, где это значение равно». Спасибо за разъяснения на втором посту. Я думаю, что теперь понимаю, что вы имеете в виду, например, умеете делать что-то вроде «valueOfXMLValue * 2». Да, насколько мне известно, для этого требуется немного работы с Java. –

Смежные вопросы