Android - Escrevendo um componente personalizado (composto)

O aplicativo para Android que estou desenvolvendo atualmente tem uma atividade principal que cresceu bastante. Isto é principalmente porque contém umTabWidget com 3 abas. Cada aba tem alguns componentes. A atividade tem que controlar todos esses componentes de uma só vez. Então, eu acho que você pode imaginar que esta atividade tem 20 campos (um campo para quase todos os componentes). Também contém muita lógica (click listeners, lógica para preencher listas, etc).

O que normalmente faço em estruturas baseadas em componentes é dividir tudo em componentes personalizados. Cada componente personalizado teria então uma responsabilidade clara. Ele conteria seu próprio conjunto de componentes e todas as outras lógicas relacionadas a esse componente.

Eu tentei descobrir como isso pode ser feito, e eu encontrei algo na documentação do Android que eles gostam de chamar de "Controle Composto". (Vejohttp://developer.android.com/guide/topics/ui/custom-components.html#compound e vá para a seção "Compound Controls") Eu gostaria de criar um componente com base em um arquivo XML que define a estrutura da visão.

Na documentação diz:

Observe que, assim como com uma Activity, você pode usar a abordagem declarativa (baseada em XML) para criar os componentes contidos ou pode aninhá-los programaticamente a partir do seu código.

Bem, isso é uma boa notícia! A abordagem baseada em XML é exatamente o que eu quero! Mas não diz como fazer, exceto que é "como com uma atividade" ... Mas o que eu faço em uma atividade é chamadasetContentView(...) para inflar as vistas do XML. Esse método não está disponível se, por exemplo, a subclasseLinearLayout.

Então eu tentei inflar o XML manualmente assim:

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}

Isso funciona, exceto pelo fato de que o XML que estou carregando temLinearLayout declarado como o elemento raiz. Isso resulta no infladoLinearLayout sendo um filho deMyCompoundComponent que em si já é umLinearLayout!! Então agora temos um LinearLayout redundante entreMyCompoundComponent e as visões que realmente precisam.

Alguém pode me fornecer uma maneira melhor de abordar isso, evitando ter uma redundânciaLinearLayout instanciado?

questionAnswers(2)

yourAnswerToTheQuestion