Основное направление деятельности 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
экземпляров?
источник
Ответы:
Используйте тег слияния в качестве корня XML
Проверьте эту статью.
источник
Я думаю, что вы должны использовать имя своего класса в качестве корневого элемента XML:
И затем ваш класс будет производным от того макета, который вы хотите использовать. Обратите внимание: если вы используете этот метод, вы не используете здесь надувной макет.
И затем вы можете использовать свое представление в макетах XML как обычно. Если вы хотите сделать представление программным, вы должны его раздуть:
К сожалению, это не позволяет вам сделать это,
v = new MyView(context)
потому что, похоже, нет способа обойти проблему вложенных макетов, так что на самом деле это не полное решение. Вы можете добавить такой метод, чтобыMyView
сделать его немного приятнее:Отказ от ответственности: я могу говорить полную чушь.
источник
<com.example.views.MyView />
и вашимиsetData
иonFinishInflate
звонки начинают бросать неработающие, и вы не имеете ни малейшего представления , почему.