O aplicativo para Android que estou desenvolvendo atualmente tem uma atividade principal que cresceu bastante. Isso ocorre principalmente porque ele contém um TabWidget
com 3 guias. Cada guia possui alguns componentes. A atividade tem que controlar todos esses componentes de uma só vez. Então, eu acho que você pode imaginar que essa Atividade tenha 20 campos (um campo para quase todos os componentes). Também contém muita lógica (clique em listeners, em 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 uma responsabilidade clara. Ele conteria seu próprio conjunto de componentes e todas as outras lógicas relacionadas a esse componente.
Tentei descobrir como isso pode ser feito e encontrei algo na documentação do Android que eles chamam de "Controle composto". (Consulte http://developer.android.com/guide/topics/ui/custom-components.html#compound e vá até a seção "Compound Controls"). Gostaria de criar esse componente com base em um arquivo XML que define o ver estrutura.
Na documentação, diz:
Observe que, assim como em 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 fazê-lo, exceto que é "como uma atividade" ... Mas o que faço em uma atividade é chamar setContentView(...)
para aumentar as visualizações do XML. Esse método não está disponível se você, por exemplo, subclasse LinearLayout
.
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 foi LinearLayout
declarado como o elemento raiz. Isso resulta no inflado LinearLayout
ser um filho do MyCompoundComponent
qual ele já é um LinearLayout
!! Portanto, agora temos um LinearLayout redundante no meio MyCompoundComponent
e as visualizações de que ele realmente precisa.
Alguém pode me fornecer uma maneira melhor de abordar isso, evitando LinearLayout
instâncias redundantes ?