Интересно, если это плохая практика, чтобы добавить представление в иерархию представлений во время выполнения в уже завышенное представление.
Давайте рассмотрим мой пример. У меня есть иерархия классов активностиДобавление вида/макетов в уже раздутую иерархию во время выполнения?
- Базовая деятельность - базовая деятельность, включающая базовую конфигурацию для методов жизненного цикла, без раздувания макета (setContentView).
- SingleFramgentActivity он установил метод поиска в
onCreate
методе. Макет для этой деятельности выглядит следующая
с
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout android:id="@+id/fragment_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</FrameLayout
<ViewStub
android:id="@+id/stub_progress_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inflatedId="@+id/progress_bar_buttons"
android:layout="@layout/inflate_stub_progressbar_bg"/>
</FrameLayout>
Есть несколько проблем.
Как вы можете видеть здесь, существует один контейнер-фрагмент FrameLayout
для хранения текущего фрагмента, насколько это SingleFragmentActivity
.
Что мне нужно сделать, так это добавить панель инструментов в мой макет и должна присутствовать на всем фрагменте внутри этой операции.
Моего макета в этом случае должен выглядеть
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout android:id="@+id/fragment_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</FrameLayout>
<include
android:id="@+id/toolbar"
layout="@layout/include_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"/>
<ViewStub
android:id="@+id/stub_progress_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inflatedId="@+id/progress_bar_buttons"
android:layout="@layout/inflate_stub_progressbar_bg"/>
</FrameLayout>
Есть несколько проблем.
1. Я уже раздул макет в классе SingleFramgentActivity
. Поэтому у меня есть только способ добавить к уже раздутой иерархии, получить корневой вид и вызвать метод addView
. Если да, посмотрите следующий вопрос.
2. Мне нужно только добавить некоторый вид, мне нужно добавить файл макета, чтобы просмотреть иерархию BETWEEN двух уже существующих представлений. FrameLayout и ViewStub из-за Z размещения представления в FrameLayout.
Существует несколько решений для этой проблемы
1. Включите панель инструментов в каждом фрагменте, где она мне нужна (во всех фрагментах внутри действия). Кажется, это не лучший способ сделать из-за дублирования кода. (Не повторяйте правило).
2. Используйте некоторый базовый класс ToolbarFragment, и в этом случае я должен добавить все необходимые представления унаследованными фрагментами во время выполнения.
3. Используйте некоторый класс инструментов Decorator ToolbarActivity и, как я описал выше, добавьте в уже раздутую иерархию представлений. 4. Используйте макет так же, как и для SingleFramgentActivity, но добавьте туда тег панели инструментов и переименуйте класс в SingleToolbarFragmentActivity. Кажется, что принцип единственной ответственности был просто сломан. И что если нужно только панель инструментов без контейнера фрагмента или наоборот.
Поэтому мне нужен совет, что является лучшим способом сделать это. Неплохая практика о производительности?
Пожалуйста, предложите, что лучше использовать в этом случае, чтобы не вызывать проблем с производительностью и не оставлять код максимально читаемым.
Спасибо за ответ – CROSP