Основное направление деятельности Android-приложения, которое я сейчас разрабатываю, стало довольно большим. Это главным образом потому, что он содержит TabWidget
с 3 вкладками. Каждая вкладка состоит из нескольких компонентов. Действие должно контролировать все эти компоненты одновременно. Итак, я думаю, вы можете представить, что это Activity имеет около 20 полей (поле почти для каждого компонента). Также он содержит много логики (прослушиватели кликов, логику для заполнения списков и т. Д.).
То, что я обычно делаю в компонентных фреймворках, - это разбиваю все на пользовательские компоненты. Тогда каждый пользовательский компонент будет нести четкую ответственность. Он будет содержать собственный набор компонентов и всю остальную логику, связанную с этим компонентом.
Я попытался выяснить, как это можно сделать, и нашел в документации Android кое-что, что они называют «составным элементом управления». (См. http://developer.android.com/guide/topics/ui/custom-components.html#compound и прокрутите до раздела «Составные элементы управления»). Я хотел бы создать такой компонент на основе XML-файла, определяющего структуру представления.
В документации сказано:
Обратите внимание, что, как и в случае с Activity, вы можете использовать либо декларативный (на основе XML) подход для создания содержащихся компонентов, либо вы можете программно их вкладывать из своего кода.
Что ж, это хорошие новости! Подход на основе XML - это именно то, что мне нужно! Но в нем не говорится, как это сделать, за исключением того, что это «как с Activity» ... Но то, что я делаю в Activity, - это вызов setContentView(...)
для расширения представлений из XML. Этот метод недоступен, если вы, например, подкласс LinearLayout
.
Итак, я попытался раздувать XML вручную следующим образом:
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);
}
}
Это работает, за исключением того факта, что загружаемый мной XML LinearLayout
объявлен как корневой элемент. Это приводит к тому, что завышенный LinearLayout
является потомком MyCompoundComponent
, который сам уже является LinearLayout
!! Итак, теперь у нас есть избыточный LinearLayout между MyCompoundComponent
и теми представлениями, которые ему действительно нужны.
Может ли кто-нибудь предоставить мне лучший способ подойти к этому, избегая создания дублирующего LinearLayout
экземпляра?