2012-02-07 6 views
1

Есть ли способ, которым я могу обойтись, чтобы добавить параметры layout_width и layout_height в мои пользовательские представления? Я знаю, что есть несколько встроенных представлений в Android, для которых вам не нужно предоставлять эти атрибуты.layout_width и layout_height

ответ

0

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

Посмотрите здесь для справки http://developer.android.com/guide/topics/ui/declaring-layout.html#layout-params

+0

Как и таблица, они мне не нужны, поскольку родительский вид управляет параметрами макета детей. Поэтому атрибуты, которые я указываю в XML, вообще ничего не делают. –

0

Из того же Reference Дэйва предложил.

все просмотреть группы включает ширину и высоту (layout_width и layout_height), и каждый вид требуется, чтобы определить их. Многие LayoutParams также включают в себя дополнительные поля и границы.

Похоже, вы, , должны.

+0

Как выглядит TableRow ViewGroup? –

+0

@NicholasRoge Я не знал о 'ViewGroup', но он говорит, что это« абстрактный класс »(http://developer.android.com/reference/android/view/ViewGroup.html). Классы, расширяющие его, они реализуют 'layout_height' и' layout_width' –

+0

@NicholasRoge Но, как я уже сказал, я об этом не знал. Можете ли вы определить ViewGroup и использовать его в качестве макета в xml, например? Я сомневаюсь в этом. –

2

Это не обязанность View, чтобы решить, может ли она/должна предоставлять эти атрибуты. Родительская ViewGroup определяет, являются ли эти атрибуты обязательными или нет. TableRow, например, делает их необязательными. Другие макеты (LinearLayout, FrameLayout и т. Д.) Требуют этих параметров.

+0

Я об этом не думал. В этом случае, как сделать родительскую ViewGroup, пусть XML будет «Эй, этот парень не должен показывать мне эти вещи»? –

0

Если вы снижаете общие и избыточные атрибуты, что вам нужно, тогда вы должны попробовать стиль.

Руководство разработчика here.

+0

Это не редукция, в которой я собираюсь. Это удаление. Для них нет никакой необходимости быть там. –

0

Проблема в том, что ViewGroup.LayoutParams.setBaseAttributes() использует строгий getLayoutDimension(int, String). Вам необходимо расширить любые параметры LayoutParams и переопределить setBaseAttributes. Внутри вы можете вручную установить ширину и высоту или использовать более мягкий getLayoutDimension(int, int). Наконец, вам придется переопределить в своем классе макета, что вы используете свои собственные LayoutParams.

@Override 
    public LayoutParams generateLayoutParams(AttributeSet attrs) { 
     return new LayoutParams(getContext(), attrs); 
    } 

    public static class LayoutParams extends FrameLayout.LayoutParams { 
     public LayoutParams(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     @Override 
     protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) { 
     width = a.getLayoutDimension(widthAttr, WRAP_CONTENT); 
     height = a.getLayoutDimension(heightAttr, WRAP_CONTENT); 
     } 
    }