2012-04-13 2 views
0

У меня возникли проблемы с получением моего LinearLayout для отображения просмотров в желаемой пропорции. Я просмотрел около 10 или 15 вопросов о LinearLayout и layout_weight, но по какой-то причине в моем случае ответы не применяются. Я создаю пользовательский AlertDialog цветовую палитру с настраиваемым видом созданной следующим образом:Layout_weight не работает по желанию при использовании вложенного LinearLayout

private LinearLayout createLayout() { 
    //Create our top-level layout 
    LinearLayout mainLayout = new LinearLayout(mContext); 
    mainLayout.setOrientation(LinearLayout.VERTICAL); 
    mainLayout.setPadding(15, 0, 15, 0); 
    //Make the preset view at the top 
    LinearLayout.LayoutParams presetViewParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.2f); 
    mainLayout.addView(new PresetView(mContext), presetViewParams); 
     //Create another linear layout 
     LinearLayout subLayout = new LinearLayout(mContext); 
     subLayout.setOrientation(LinearLayout.HORIZONTAL); 
     subLayout.setPadding(0, 15, 0, 15); 
     //Add the Sat Lum View to the second layout 
     LinearLayout.LayoutParams satLumViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.60f); 
     subLayout.addView(new SatLumView(mContext), satLumViewParams); 
     //Add the divider between the sat lum view and the hue view 
     LinearLayout.LayoutParams dividerViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.1f); 
     subLayout.addView(new DividerView(mContext), dividerViewParams); 
     //Add the Hue View to the second layout 
     LinearLayout.LayoutParams hueViewParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.30f); 
     subLayout.addView(new HueView(mContext), hueViewParams); 
     //Add the second layout to the first layout 
     LinearLayout.LayoutParams subLayoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.7f); 
     mainLayout.addView(subLayout, subLayoutParams); 
    //Add the Line view at the bottom of the main layout 
    LinearLayout.LayoutParams lineParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.1f); 
    mainLayout.addView(new LineView(mContext), lineParams); 
    //Return our completed layout 
    return mainLayout; 
} 

Проблема у меня в том, что несмотря на то, установить layout_height моих трех вертикальных элементов (PresetView, subLayout и LineView) до «0», вес по-прежнему не распределяет доступное пространство, как я хочу. subLayout не получает 70% пространства, но всегда меньше. Из того, что я могу сказать, PresetView всегда получает столько вертикального пространства, сколько он просит, а subLayout и LineView оставляют остальное. Вот мой onMeasure() метод для PresetView:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = resolveSize(250, widthMeasureSpec); 
     int height = resolveSize(150, heightMeasureSpec); 
     setMeasuredDimension(width, height); 
    } 

250 и 150 являются довольно произвольными ценности - PresetView предназначен для работы практически с любым набором измерений (потому что я хочу, чтобы LinearLayout контролировать свой размер!). У меня создалось впечатление, что использование layout_height 0 и указание веса помещают макет в управление пространством, занимаемым View, а не View, контролирующим его. Почему PresetView все еще занимает полные 150 пикселей, когда я установил его layout_height в 0?

Метод onMeasure() других представлений идентичен PresetView, только с разными значениями.

ответ

1

Похоже, что я переопределял onMeasure() ненадлежащим образом. Маршрут, который я взял, полезен, если представление имеет предопределенные измерения (вы ЗНАЕТЕ, что он будет 250 x 150 пикселей). Однако, так как я хотел, чтобы мои представления для масштабирования, чтобы соответствовать любой размер экрана и управлять полностью их макеты, все, что мне нужно сделать, это использовать реализацию по умолчанию onMeasure():

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

Это позволяет в layout_weight атрибут обрабатывать все размеры дочерних представлений.

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