O ponto de partida usual é algum tipo de layout; portanto, crie uma classe que estenda um layout. Talvez, no caso de uma caixa de combinação, possamos usar um LinearLayout com orientação horizontal. Lembre-se de que outros layouts podem ser aninhados internamente, de modo que o componente composto pode ser arbitrariamente complexo e estruturado. Observe que, assim como ocorre com uma atividade, você pode usar a abordagem declarativa (baseada em XML) para criar os componentes contidos ou pode aninhá-los de maneira programática no código.
No construtor da nova classe, pegue os parâmetros esperados pela superclasse e transmita-os para o construtor da superclasse primeiro. Em seguida, você pode configurar as outras visualizações para usar no novo componente. Esse é o momento em que você cria o campo EditText e a PopupList. Você também pode introduzir seus próprios atributos e parâmetros no XML que podem ser extraídos e usados pelo construtor.
Você também pode criar listeners para eventos que as visualizações contidas possam gerar, por exemplo, um método listener para o List Item Click Listener para atualizar o conteúdo do EditText se uma seleção de lista for feita.
Você também pode criar suas próprias propriedades com acessadores e modificadores, por exemplo, permitir que o valor de EditText seja definido inicialmente no componente e consultar o conteúdo quando necessário.
Ao estender um layout, não é necessário substituir os métodos onDraw() e onMeasure(), já que o layout terá um comportamento padrão que provavelmente funcionará bem. No entanto, você ainda poderá substituí-lo se for necessário.
Você pode substituir outros métodos on..., como onKeyDown(), para escolher determinados valores padrão na lista pop-up de uma caixa de combinação quando uma determinada tecla é pressionada.
Para resumir, o uso de um layout como base para um controle personalizado tem uma série de vantagens, incluindo: