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