2015-07-08 4 views
1

Интересно, если это плохая практика, чтобы добавить представление в иерархию представлений во время выполнения в уже завышенное представление.
Давайте рассмотрим мой пример. У меня есть иерархия классов активностиДобавление вида/макетов в уже раздутую иерархию во время выполнения?

  1. Базовая деятельность - базовая деятельность, включающая базовую конфигурацию для методов жизненного цикла, без раздувания макета (setContentView).
  2. 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. Кажется, что принцип единственной ответственности был просто сломан. И что если нужно только панель инструментов без контейнера фрагмента или наоборот.

Поэтому мне нужен совет, что является лучшим способом сделать это. Неплохая практика о производительности?
Пожалуйста, предложите, что лучше использовать в этом случае, чтобы не вызывать проблем с производительностью и не оставлять код максимально читаемым.

ответ

1

Нет проблемы с производительностью при добавлении просмотров во время выполнения, если вы не добавляете их один за другим или меняете границы его компоновки или, что то же самое, вызывать несколько раз до requestLayout/invalidate. Все, что не должно вызывать каких-либо проблем с производительностью.

Учитывая то, что я обычно делаю в вашем случае, это создать давайте назовите его BaseActivity с некоторыми методами, которые могут быть расширены как hasToolbar():boolean, и в момент создания этого мероприятия я раздуваю то, что необходимо, и добавляю его в Посмотреть.Это один из подходов, но любой из тех, кого вы упомянули, может работать без проблем с производительностью, поскольку раздувание одного макета не так много времени (например, в ListViews, например).

+0

Спасибо за ответ – CROSP

Смежные вопросы