Подтвердить что ты не робот

Android программно включает в себя макет (т.е. Без XML)

Итак, я создал подкласс Activity под названием CustomTitlebarActivity. По сути, каждое основное действие в моем приложении будет иметь настраиваемый заголовок с множеством общих функций, таких как кнопка "Домой", название, кнопка поиска и т.д. В моей текущей реализации я все еще явно использую оператор include в XML-макете для каждый CustomTitlebarActivity:

<include layout="@layout/titlebar" />

Кажется естественным, что я должен сделать это в CustomTitlebarActivity. У меня есть два вопроса: какой код может заменить этот тег include, и где я должен поместить код? (Моим первым инстинктом было бы поместить его в метод CustomTitlebarActivity setContentView.)

В соответствующей заметке я хотел бы получить представление о лучших способах повторного использования кода пользовательского интерфейса Android (даже если, по сути, заголовки должны немного различаться между действиями.)

4b9b3361

Ответ 1

Лично я бы, вероятно, написал подкласс Activity всегда setContentView к файлу макета, содержащему вертикальный fill_parent LinearLayout, содержащий только мою строку заголовка: -

<LinearLayout android:id="@+id/custom_titlebar_container"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
   <!--titlebar here-->
</LinearLayout>

Затем я бы определил абстрактный getContentAreaLayoutId() метод в CustomTitlebarActivity, который возвращает макет ID содержимого под заголовком для каждого подкласса; база onCreate() of CustomTitlebarActivity затем просто вызовет

setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));

В качестве альтернативы вы можете использовать свой абстрактный метод для получения области содержимого View, а не int, что дает вам больше гибкости для динамического построения ваших представлений (но заставляя вас раздувать их самостоятельно в простой дампе этот XML-макет здесь case).

Ответ 2

Я тоже встречался с этой проблемой, и я просто решил ее сейчас. Я думаю, что мое решение проще:

  • создать раздуватель:

    LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  • раздуйте дочерний макет:

    View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  • добавить его в родительский:

    parentLayout.addView(childLayout);
    

Сделано, наслаждайся!