2013-01-15 6 views
1

У меня есть настраиваемый макет, определенный в файле XML с корнем RelativeLayout с кучей детского представления.Наращивание пользовательского вида макета в класс расширения макета в Android

Теперь я определил следующий класс:

public class MyCustomView extends RelativeLayout { 

    public MyCustomView(Context context) { 
     super(context); 
     init(); 
    } 

    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init();  
    } 

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle);  
     init(); 
    } 

    private void init() { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.my_custom_view, this, true); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     Log.d("Widget", "Width spec: " + MeasureSpec.toString(widthMeasureSpec)); 
     Log.d("Widget", "Height spec: " + MeasureSpec.toString(heightMeasureSpec)); 

     int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
     int widthSize = MeasureSpec.getSize(widthMeasureSpec); 

     int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
     int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

     int chosenWidth = chooseDimension(widthMode, widthSize); 
     int chosenHeight = chooseDimension(heightMode, heightSize); 

     int chosenDimension = Math.min(chosenWidth, chosenHeight); 

     setMeasuredDimension(chosenDimension, chosenDimension); 
    } 

    private int chooseDimension(int mode, int size) { 
     if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) { 
      return size; 
     } else { 
      return getPreferredSize(); 
     } 
    } 

    private int getPreferredSize() { 
     return 400; 
    } 
} 

Как вы можете видеть, я устанавливаю корень MyCustomView экземпляра и прикрепить флаг к истине.

Что я хочу достичь, так это то, что когда я добавлю этот пользовательский вид в другой XML-макет, он создаст экземпляр класса MyCustomView, который будет иметь макет, определенный в XML.

Я уже пытаюсь использовать тег <merge>, но таким образом я теряю возможность упорядочивать мои представления в формате XML, как я хочу.

Я также пытался раздуть XML и добавить его в виде MyCustomView, но таким образом я получаю избыточность RelativeLayout.

Последнее, что я добавил onMeasure() только для полноты.

+0

Ваша проблема в том, что представления из 'R.layout.widget_view' не отображаются в компоненте' Widget', правильно? – Luksprog

+0

Точно. происходит инфляция, но вид ребенка не показан. –

ответ

2

инфляция происходит, но вид ребенка не показаны

RelativeLayout делает немного больше (много), чем то, что вы сделали в onMeasure макет (в основном дети не измеряются вообще с вашим кодом, чтобы у них не было чего показать). Если вы продляете ViewGroup, например RelativeLayout, вы должны позволить этому классу выполнять свои обратные вызовы (onMeasure, onLayout) или, по крайней мере, очень тщательно реплицировать методы и изменять их так, как вы хотите (если вы хотите что-то увидеть).

Итак, удалите метод onMeasure, чтобы увидеть детей или объяснить, почему вы его переопределили.

+0

Я попытался удалить onMeasure() и все еще не работает. –

+0

@ Daniel Убедитесь, что вы полностью удалили его, это не помешает, если вы разместите файл макета 'my_custom_view'. – Luksprog

+0

Спасибо, ты прав! BTW, я добавил onMeasure(), чтобы заставить ширину и высоту моего представления быть одинаковыми. любая идея, как я могу это сделать по-другому? –

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