Сколько ViewStubs слишком много для одного XML-файла макета?
У меня есть макет, определенный в файле XML (base_layout.xml
) который может содержать 20+ ViewStub
определения в дополнение к 3-5 другим представлениям, таким как ImageView
и LinearLayout
содержащий 3-5 ImageButton
Просмотры.
Должен ли я беспокоиться о том, сколько ViewStub
просмотров я размещаю в этом файле макета?
Я читаю на сайте developer.android:
ViewStub - тупой и легкий вид. У него нет измерения, он ничего не рисует и никак не участвует в макете. Это означает, что ViewStub очень дешев, чтобы его раздувать, и очень дешево хранить в иерархии представлений.
это достаточно дешево, чтобы иметь 20+ из них? не все завышены, конечно, только 1-2 за один раз.
когда я сказал cheap enough
или говорить о том, чтобы быть concerned
, я касаюсь производительности интерфейса
редактировать: что я пытаюсь сделать: создать XML-файл макета, который может стать основой всей моей деятельности. в каждом Activity
буду раздувать правильно ViewStub
с макетом деятельности. Поскольку у меня так много видов деятельности, требующих одного и того же скелета, я хочу использовать как можно больше
у меня есть Activity
класс, который является родителем почти всех моих занятий. этот родительский класс вызывает setContentView(R.layout.base_layout);
, все, что я делаю для каждого ребенка, надувает ViewStub
внутри base_layout.xml
, это позволяет мне иметь очень настраиваемый пользовательский интерфейс с тем же видом скелета, который используется во всех моих макетах деятельности
2 ответа
Я не думаю, что вы увидите большой успех производительности. Это все еще дешевле, чем раздувать их все с самого начала.
Недостатком такого большого количества заглушек является то, что вы можете потерять из виду весь дизайн. Возможно, имеет смысл сгруппировать несколько представлений / элементов в одну группу. Может быть, вы могли бы объяснить, что вы пытаетесь сделать, и посмотреть, есть ли лучший способ реализовать это
редактировать: ну, вместо того, чтобы иметь несколько ViewStubs, которые включают в себя различные подпредставления, такие как
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/activity1"
android:layout="@layout/myActivity1"
/>
<ViewStub android:id="@+id/stub2"
android:inflatedId="@+id/activity2"
android:layout="@layout/myActivity2"
/>
просто есть один ViewStub и в вашей деятельности onCreate() сделать что-то вроде
setContentView(R.layout.base_layout);
ViewStub stub = (ViewStub)findViewById(R.id.stub);
stub.setInflateId(R.id.activity1);
stub.setLayoutResource(R.layout.myActivity2);
stub.inflate();
Таким образом, у вас все еще будет только один ViewStub в вашем base_layout, который вы можете настроить в коде перед накачкой.
LinearLayout или RelativeLayout является расширением ViewGroup
поэтому я использовал ViewGroup в качестве параметра, это мое решение
public CategoryViewController(Context context, ViewGroup containerView) {
this.context = context;
LayoutInflater inflater = LayoutInflater.from(context);
View categoryLayout = inflater.inflate(R.layout.category_section, null, false);
containerView.addView(categoryLayout);
this.categoryView = categoryLayout;
}